ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 变量提升 - 只提升声明,不提升赋值 * var 声明的变量会被提升,并赋值 undefine ## 函数提升 - **整个函数都提到前面去** * 函数表达式方式**不会被提升** ``` foo4() var foo4 = function() {console.log(111)} // Uncaught ReferenceError: foo4 is not defined ``` ``` console.log(foo3) var foo3 = function() {console.log(111)} // 输出 undefined ``` ### var 定义的函数表达式,为什么输出 foo3 的时候,会是 undefined? 1. js 代码执行分为 编译阶段和执行阶段 2. 对于 var a = 2 这样的表达式,编译阶段会编译为**var a** , 在执行阶段进行复制 **a = 2** 3. 函数表达式在编译阶段会被编译成 var foo3, 执行阶段进行赋值 4. 所以函数表达式不存在函数提升,为定义前调用会报错 5. 函数声明方式可以被提升 ``` foo() function foo() {console.log(111)} ``` ## js 不存在块级作用域 ``` foo(); // "b" var a = true; if (a) { function foo() { console.log("a"); } } else { function foo() { console.log("b"); } } ``` 变量 nnn 还是会被声明提前 ## 函数提升优先于变量提升 ``` console.log(fun) function fun() { console.log(1) } var fun = 23 // 输出 fun 函数 ``` ## 重复的函数声明会被覆盖 ``` foo(); //200 function foo() { console.log(100); } function foo() { console.log(200); } ``` ## 重复的变量声明会被忽略 ## 声明过的变量不会重复声明 ## 练习 ``` function Foo () { getName = function () { console.log(1); }; return this; }; Foo.getName = function () { console.log(2); }; Foo.prototype.getName = function () { console.log(3) }; var getName = function () { console.log(4) }; function getName () { console.log(5) }; Foo.getName() getName() Foo.getName() getName() new Foo.getName() ```