Variable hoisting变量提高是js比较有特色的地方,它容许你先使用变量,在其后面再进行变量声明,不会抛出 Uncaught ReferenceError异常。虽然变量被提高到前面,可是它的默认值则是undefind,在引用的时候也使用这个值,知道在其面后进行赋值,在使用时候即为所赎的值。javascript
举个例子:java
console.log(x) //若是后面不定义x 则抛出"ReferenceError: x is not defined //若是后面对x定义 则打印出undefined var x = 2 var abc = "abcd"; (function(){ console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })() //上面代码能够这样翻译 var x; console.log(x)//undefined var x = 2 var abc = "abcd"; (function(){ var abc; console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })()
基于这个缘由,在平时编写代码时候,尽可能把变量声明放到代码块最顶层位置,能够使代码结构清晰。
注意的是,在ES6语法中新增的let or const 声明方式,并不支持这种变量提高,强行使用会抛出错误ReferenceError浏览器
对于函数提高,只用函数的声明被提高,表达式则不会被提高函数
/* 函数声明 */ foo(); // "bar" function foo() { console.log("bar"); } /* 函数表达式 表达式定义的函数,称为匿名函数。匿名函数没有函数提高。*/ baz(); // TypeError: baz is not a function //此时的"baz"至关于一个声明的变量,类型为undefined。 因为baz只是至关于一个变量,所以浏览器认为"baz()"不是一个函数。 var baz = function() { console.log("bar2"); };