变量提升变量提升变量提升是js的一个特性,它允许你先使用变量,然后再声明变量,不会抛出UncaughtReferenceError异常。变量虽然被提升到最前面,但是它的默认值是undefined,引用的时候也是使用这个值,直到后面被赋值,使用的时候就是赎回的值。例如:console.log(x)//如果后面没有定义x,会抛出“ReferenceError:xisnotdefined//如果后面定义了x,会打印出undefinedvarx=2varabc="abcd";(function(){console.log(abc);//undefinedvarabc="1234";console.log(abc);//"1234"})()//上面的代码可以这样翻译varx;console.log(x)//undefinedvarx=2varabc="abcd";(function(){varabc;console.log(abc);//undefinedvarabc="1234";console.log(abc);//"1234"})()为此,在编写代码时,尽量将变量声明放在代码块的最前面,这样可以使代码结构清晰。注意新的let或const声明方式在ES6语法,不支持这种变量提升,强行使用会抛错ReferenceErrorFunctionpromotion对于函数提升,只提升函数的声明,不会提升表达式/*functiondeclaration*/foo();//"bar"functionfoo(){console.log("bar");}/*由函数表达式表达式定义的函数称为匿名函数。匿名函数没有函数提升。*/baz();//TypeError:bazisnotafunction//此时“baz”相当于声明的变量,其类型未定义。由于baz只相当于一个变量,浏览器认为“baz()”不是一个函数。varbaz=function(){console.log("bar2");};
