javascript 提升:首先提升什么——变量还是函数?
javascript hoisting: what would be hoisted first — variable or function?
最近我对 javascript 提升行为感到困惑,现在我陷入了困境。
所以,有两个例子。
var alpha = 'alpha';
var beta = 'beta';
f(); //beta
var f = function f1() {
console.log(beta);
};
function f() {
console.log(alpha);
}
f(); // alpha
第一个按预期工作,因为当 Javascript 设置词法环境时,函数声明覆盖了我们的变量 f(值为 "undefined")。
但是第二个给了我一个推动,我有点不明白。
var alpha = 'alpha';
var beta = 'beta';
f(); // - alpha
function f() {
console.log(alpha);
}
var f = function f1() {
console.log(beta);
};
f(); // beta
为什么变量f没有被提升到out代码的顶部,覆盖掉我们之前提升的函数?
为什么在 "first f" 电话中我收到 "alpha"。我认为,这一定是一个错误,例如:
"f is not a function",因为在 first f 调用中我例外,f 将是 "undefined".
从技术上讲,这两个片段是相同的
类似
function f() {
console.log(alpha);
}
var alpha = 'alpha';
var beta = 'beta';
var f; // ignored because f is already defined
f(); // - first f
f = function f1() {
console.log(beta);
};
f(); // ** - second f
或者也许 - 不过,我很确定 function
是 "hoisted" 第一个
var alpha = 'alpha';
var beta = 'beta';
var f;
function f() {
console.log(alpha);
}
f(); // - first f
f = function f1() {
console.log(beta);
};
f(); // ** - second f
鉴于var foo = something
,只有变量声明被提升。
这意味着 var foo
被提升,但 foo = something
将 运行 按阅读顺序排列。
给定function foo() {}
,变量声明和函数赋值都被提升。这将创建变量 foo
并为其赋予函数的值。
如果你有以上两种情况,那么你声明变量两次(没有额外的效果)并为其赋值函数的值(因为这是唯一的赋值)。
所以在你的第二个例子中……
函数声明已提升,因此 f(); // - first f
调用它。
函数表达式的赋值没有被提升,但是 f(); // ** - second f
以正常的阅读顺序出现在它之后,所以第二次调用 foo()
命中那个。
最近我对 javascript 提升行为感到困惑,现在我陷入了困境。
所以,有两个例子。
var alpha = 'alpha';
var beta = 'beta';
f(); //beta
var f = function f1() {
console.log(beta);
};
function f() {
console.log(alpha);
}
f(); // alpha
第一个按预期工作,因为当 Javascript 设置词法环境时,函数声明覆盖了我们的变量 f(值为 "undefined")。
但是第二个给了我一个推动,我有点不明白。
var alpha = 'alpha';
var beta = 'beta';
f(); // - alpha
function f() {
console.log(alpha);
}
var f = function f1() {
console.log(beta);
};
f(); // beta
为什么变量f没有被提升到out代码的顶部,覆盖掉我们之前提升的函数? 为什么在 "first f" 电话中我收到 "alpha"。我认为,这一定是一个错误,例如: "f is not a function",因为在 first f 调用中我例外,f 将是 "undefined".
从技术上讲,这两个片段是相同的
类似
function f() {
console.log(alpha);
}
var alpha = 'alpha';
var beta = 'beta';
var f; // ignored because f is already defined
f(); // - first f
f = function f1() {
console.log(beta);
};
f(); // ** - second f
或者也许 - 不过,我很确定 function
是 "hoisted" 第一个
var alpha = 'alpha';
var beta = 'beta';
var f;
function f() {
console.log(alpha);
}
f(); // - first f
f = function f1() {
console.log(beta);
};
f(); // ** - second f
鉴于var foo = something
,只有变量声明被提升。
这意味着 var foo
被提升,但 foo = something
将 运行 按阅读顺序排列。
给定function foo() {}
,变量声明和函数赋值都被提升。这将创建变量 foo
并为其赋予函数的值。
如果你有以上两种情况,那么你声明变量两次(没有额外的效果)并为其赋值函数的值(因为这是唯一的赋值)。
所以在你的第二个例子中……
函数声明已提升,因此 f(); // - first f
调用它。
函数表达式的赋值没有被提升,但是 f(); // ** - second f
以正常的阅读顺序出现在它之后,所以第二次调用 foo()
命中那个。