变量提升
Variable hoisting变量提升是js比较有特点的地方,它允许你先使用变量,在其后面再进行变量声明,不会抛出 Uncaught ReferenceError异常。虽然变量被提升到前面,但是它的默认值则是undefind,在引用的时候也使用这个值,知道在其面后进行赋值,在使用时候即为所赎的值。
举个例子:
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");
};