为什么JavaScript函数在定义之前可以访问
Why can JavaScript functions to be accessed Before they are defined?
可能重复:
为什么我可以在函数之前使用它';在Javascript中定义了什么?
正如预期的那样,由于未定义Foo
,以下代码引发错误:
window.Foo = Foo;
同样正如预期的那样,这引发了相同的错误:
window.Foo = Foo;
Foo = function() {
...
};
奇怪的是,这还不错:
window.Foo = Foo;
function Foo(){
...
};
这怎么可能?JavaScript不是逐行解释的吗?
吊装只是故事的一部分。
首先,解释吊装:
在JavaScript程序中使用var
时,需要声明一个变量。只要在JS作用域中声明了该变量,它就会被提升到该作用域的顶部。JavaScript只有全局或函数作用域;在功能的情况下
function hoistAway() {
console.log(a);
var a = 5;
}
相当于
function hoistAway() {
var a;
console.log(a);
a = 5;
}
正如您所看到的,声明被挂起,但初始化没有。因此,此代码将在控制台上记录undefined
,而不是5。然而,如果存在a
,则会感到满意。
如果不使用var
,则声明不是显式的,因此不会被挂起。因此:
function hoistAway() {
console.log(a);
a = 5;
}
将导致一条错误消息。
在您的示例中:
window.Foo = Foo;
Foo
从未被声明,所以您会得到一个错误。
window.Foo = Foo;
Foo = function() {
...
};
同样,Foo没有被宣布,所以没有吊装。备案:
window.Foo = Foo;
var Foo = function() {
...
};
不会抛出错误。然而,只有申报被悬挂,所以如果你做了类似的事情
var bob = {};
bob.Foo = Foo;
var Foo = function() {
...
};
则CCD_ 7将是CCD_。window.Foo = Foo
的特殊情况很奇怪,因为Foo
和window.Foo
在全局范围内是相同的。
最后:
window.Foo = Foo;
function Foo(){
...
};
有效,因为函数声明(与函数表达式相反)也被挂起;名称和定义都被挂起了,所以这将按预期工作。
首先解析脚本,允许您的代码调用稍后定义的函数。
相关文章:
- 在js中访问元素时不透明度和样式未定义,但在css中定义
- UI5:如何访问视图中定义的html元素
- 访问嵌套 json 对象的属性将返回未定义
- 如何访问npm模块抛出的自定义错误对象[error:[object object]]
- 如何访问自定义 HTML 属性
- AngularJS:如何访问自定义指令中的input[date]min属性
- Uncaught ReferenceError:尝试在Android网络视图中访问时未定义函数
- UI网格:如何从自定义函数访问MODEL_COL_FIELD
- 是否可以在定义对象时访问对象值
- 如何在 Aurelia(奥雷利亚)中访问自定义元素中的变量
- 我无法访问 IIFE 中定义的变量
- 服务变量分配了数据,但在访问时始终未定义
- 尝试从我的 chrome 扩展程序访问 gmail 中的 iframe 时出现未定义的错误,但不是从开发者控制台访问
- 我如何访问在 Angular JS 的 .then() 中定义的$scope数组
- 聚合物 - 访问自定义元素内的 DOM 输入元素
- 对自定义组件中的本地访问引用进行反应
- 访问WooCommerce中定义的Javascript函数
- 访问节点js中对象内部的数组-未定义
- 我如何访问定义在从& lt; body>
- 如何访问定义为字符串的嵌套属性,而不使用eval