tl; dr 如果在加载完成之前不调用任何东西,则应该没问题。
编辑:对于其中也包括一些ES6声明(概述
let,
const):https://developer.mozilla.org/en-
US/docs/Web/Javascript/Reference/Scope_Cheatsheet
这种奇怪的行为取决于
- 您如何定义功能以及
- 当您打电话给他们时。
这是一些例子。
bar(); //This won't throw an errorfunction bar() {}foo(); //This will throw an errorvar foo = function() {}bar();function bar() { foo(); //This will throw an error}var foo = function() {}bar();function bar() { foo(); //This _won't_ throw an error}function foo() {}function bar() { foo(); //no error}var foo = function() {}bar();
这是因为所谓的 吊装 !
有两种定义函数的方法:函数 _声明_和函数表达式。区别是烦人和微小,所以我们只说这有点错误:如果您像那样编写它
function name(){},那是一个 声明 ,而当您像这样编写它
varname=function(){}(或分配给返回的匿名函数,诸如此类)时,它就是函数
表达式 。首先,让我们看一下如何处理变量:
现在,如何处理函数 声明 :var foo = 42;//the interpreter turns it into this:var foo;foo = 42;
var foo = 42;function bar() {}//turns intovar foo; //Insanity! It's now at the topfunction bar() {}foo = 42;
该
var声明“抛出”的 创作 中
foo,以最顶端,但并不值分配给它。函数声明紧随其后,最后为分配了一个值
foo。那呢?
bar();var foo = 42;function bar() {}//=>var foo;function bar() {}bar();foo = 42;
只有 声明 中
foo移动到顶部。分配仅在发出呼叫后
bar进行,即所有吊装发生之前的位置。最后,为简洁起见:
现在,函数 表达式 呢?bar();function bar() {}//turns tofunction bar() {}bar();
var foo = function() {}foo();//=>var foo;foo = function() {}foo();
就像普通的变量,首先
foo是 宣布 在该范围内的最高点,然后将它分配一个值。让我们看看第二个示例为什么引发错误。
bar();function bar() { foo();}var foo = function() {}//=>var foo;function bar() { foo();}bar();foo = function() {}
正如我们之前所看到的,只
foo悬挂的创建,而赋值则出现在“原始”(未悬挂)代码中。当
bar被调用时,它之前
foo被分配一个值,所以
foo=== undefined。现在,在的功能体内
bar,就好像您在做一样
undefined(),这会引发错误。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)