test(); //working
function test(){//do something}
这与(全局)变量对象有关吗?该函数是否在执行过程开始之前推送到变量对象?
更新:好的,我真正的问题是“提升机”是如何工作的。要了解您需要查看javascript 的执行上下文,是的,它与变量对象(它是执行上下文的一部分)有关。
test(); //working
function test(){//do something}
这与(全局)变量对象有关吗?该函数是否在执行过程开始之前推送到变量对象?
更新:好的,我真正的问题是“提升机”是如何工作的。要了解您需要查看javascript 的执行上下文,是的,它与变量对象(它是执行上下文的一部分)有关。
请参阅MDN 上的范围备忘单
function foo() { }
自动提升 foo
到示波器顶部
这与(全局)变量对象有关吗?该函数是否在执行过程开始之前推送到变量对象?
不,这只是提升。
考虑这个例子:
foo();
// ReferenceError: foo is not defined
(function(){
foo();
function foo (){
console.log("A");
};
})();
// A
(function(){
foo();
function foo (){
console.log("B");
};
})();
// B
foo();
// ReferenceError: foo is not defined
提升只是将变量名称“提升”到范围的顶部。
我的意见:
我从不把函数写成:
function foo() { ... }
我更喜欢直言不讳,因为魔术行为很糟糕;我总是把函数写成
var foo = function() { ... }
如果我觉得这个函数需要一个名字,我会给它一个名字,但仍然用var
var foo = function foo() { ... }
@bfavaretto提出了一个有效的担忧:
关于您的意见... var foo = function() { ... } 也将 foo 提升到顶部,但具有未定义的值。所以那里也有隐含的东西
诚然,它确实提升foo
了一个undefined
价值,但一切都会如愿以偿。
foo();
// TypeError: undefined is not a function
// This is good. We don't want the above function to run like that.
// This is a fatal error; the script won't even continue to run as-is.
// Comment out the above line to get it to run.
var foo = function foo() {
console.log("foo");
};
var foo2 = function foo() {
console.log("foo2");
};
// Even with the same function name, these two functions will
// output the correct values.
foo(); // foo
foo2(); // foo2
综上所述,在同一范围内拥有两个具有相同名称标识符的函数将是愚蠢的。但是,即使您确实犯了错误并编写了这样的错误代码,如果您使用如上所述的函数表达式,代码仍然可以正常工作。如果您只是使用原始问题中的命名函数,那肯定不会。
我想你在这里谈论起吊。我总是更喜欢标记函数而不是函数表达式。
这是一个函数表达式:
//Declaration 1
var foo = function(){
// code goes here
}
这是一个标记函数:
//Declaration 2
function foo(){
// same code here
}
没有任何理由对 var 进行表达式。您应该始终尝试对构造函数使用带标签的语句,这样您就可以通过其构造函数识别对象的“类型”。
人们大多在需要吊装的地方使用它。提升只是意味着在定义之前调用某些东西。
非常非常简单的例子:
foo(); // alerts 'hello'
function foo() {alert('hello');}
V/s
foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}
REFER: var functionName = function() {} vs function functionName() {}