如果这是加分的错误方法,请原谅我。我并不是一直都在这里,我会欢迎建设性的指导和/或批评。
本杰明的回答很好地解决了操作员的问题,但我想添加一个调整,使我们可以全面了解吊装及其奇特之处。
如果我们以调用开头原始代码f
,如下所示:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
输出将是:
Me duplicate.
Me original.
原因是,var
和function
语句以稍微不同的方式悬挂。
对于var
该声明被移动到当前范围*顶部,但任何分配不悬挂。就声明的var的值而言,直到到达原始赋值行之前它才是未定义的。
对于function
statement,将同时声明和定义。函数表达式,如var f = function() {...
构造中不会被提升。
因此,在吊起之后,执行就好像代码是:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
*所有JavaScript作用域都是词法作用域或函数作用域,但似乎在那时会混淆使用f词的事物。