变量提拔
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");
};