tl; dr如果不加载任何东西,直到一切加载完毕,就可以了。
编辑:有关还涵盖一些ES6声明()的概述let
,请访问const
:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheet
这种奇怪的行为取决于
- 您如何定义功能以及
- 当您打电话给他们时。
这是一些例子。
bar(); //This won't throw an error
function bar() {}
foo(); //This will throw an error
var 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() {}
,那是一个声明,而当您像这样编写它var name = function() {}
(或分配给返回的匿名函数,诸如此类)时,它就是函数表达式。
首先,让我们看一下如何处理变量:
var foo = 42;
//the interpreter turns it into this:
var foo;
foo = 42;
现在,如何处理函数声明:
var foo = 42;
function bar() {}
//turns into
var foo; //Insanity! It's now at the top
function 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 to
function 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()
,这会引发错误。