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
移到顶部。分配仅在调用 to 之后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()
,这会引发错误。