我一直认为function a(){}
与a = function(){};
然而,这两个片段的表现不同:
a();
function a() {
alert("Booya");
}
打印Booya。
a();
a = function() {
alert("Booya");
}
因异常而失败,这是有道理的,因为a在调用时确实没有被定义。
那么 - 即使a()
定义在其使用点之下,什么样的'魔术'才能让第一个代码段工作?
答案 0 :(得分:6)
这是函数声明和函数表达式之间的区别。这种差异很好地描述了例如here。
答案 1 :(得分:2)
请参阅此文章以获得解释:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
函数声明和变量声明总是被JavaScript解释器无形地移动(“提升”)到其包含范围的顶部。
答案 2 :(得分:2)
在JavaScript中,所有声明都被提升。表示变量在声明 之前可以使用,并且可以在声明之前使用函数。 将所有声明移到当前脚本的顶部是JavaScript的默认行为。
但是此功能可能会导致应用程序出现错误,因此我们使用严格模式指令来避免错误。严格模式不允许在没有声明的情况下使用变量。
的更多信息答案 3 :(得分:0)
没有神奇的,需要正确的编码。 AFAIK
答案 4 :(得分:-1)
函数是全局定义的。但是,如果将函数赋值给变量,就像在第二种情况下那样,变量的范围规则生效:在定义变量之前不能调用函数。