ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#### 声明提升 ``` a = 2; var a; console.log(a); //2 //等同于 var a; a = 2; console.log(a); ``` ``` console.log(a); //undefined var a = 2; //等同于 var a; console.log(a); a = 2; ``` var a = 2其实在解析的时候被拆成了两个声明:var a和a = 2,第一个是在编译阶段执行的,称为定义声明;第二个是在执行阶段执行的,称为赋值声明。 普通变量、函数声明会被提升,而函数表达式不会被提升。 ``` foo(); //会执行,只不过输出结果是undefined function foo(){ console.log(a); //undefined var a = 2; } //等同于 function foo(){ var a; console.log(a); a = 2; } foo(); ``` ``` //undefined(),抛出TypeError异常 foo(); //TypeError var foo = function (){...} ``` 即使是具名的函数表达式也不可以 ``` foo(); bar(); var foo = function bar(){...} //等同于 var foo; foo();//TypeError bar();//ReferenceError foo = function (){var bar = ...self...} ``` #### 提升顺序 函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。 ``` foo(); var foo; function foo(){console.log(1)} foo = function(){console.log(2)} //等同于 function foo(){console.log(1)} foo(); foo = function(){console.log(2)} ``` 由于function foo被提升到了最前面,后面的foo声明被认为是重复的声明,被舍去,所以var foo就不存在了。因此要避免重复声明,特别是当var和函数声明混在一起时不要使用相同的变量名,会引起很多危险的问题。