1. 程式人生 > >JS 函數作用域及變量提升那些事!

JS 函數作用域及變量提升那些事!

向上 沒有 asc 程序 ole 理解 繼續 不知道 階段

一直以來小編對js函數作用域及變量提升的理論知識,雖然看了多次,但也是一知半解~

這幾天做了幾道js小題,對這部分進行了從新的理解,還是有所收獲的~

主要參考書籍:

《你不知道的JavaScript(上卷)》第一部分

《JavaScript高級程序設計》第四章 4.2 執行環境與作用域

理解要點:

1. js其實是一門編譯語言,代碼的執行分為兩個階段:(《你不知道的JavaScript(上卷)》)

a.編譯階段

b.執行階段

2. 作用域嵌套:

在當前作用域中無法找到某個變量時,引擎就會在外層嵌套中繼續查找,直到找到該變量,或是抵達最外層作用域為止。(《你不知道的JavaScript(上卷)》)

3. 包括變量和函數在內的所有聲明都會在任何代碼被執行前首先被處理。變量及函數聲明的提升也是在這個階段。

註意:(1)變量及函數聲明的提升只是提升“聲明”,並不會提升“賦值”,賦值是在函數執行階段完成的。

   (2)函數表達式不能被提升。

4. 聲明變量:使用var聲明的變量會自動被添加到最近的環境中。沒有使用var聲明,該變量會自動被添加到全局變量中。(《JavaScript高級程序設計》)

註意:這裏的沒有使用var聲明指的是從當前作用域向上延伸搜索,直到在全局作用域中都沒有找到該變量的聲明,此時該變量才會自動被添加到全局變量中。(參考上面理解要點“2”)

好啦,以下拋出題目,可以先試著做一下,你的答案是什麽 ^_^

一.

1 var foo = 1;
2 function bar( ) {
3     foo=10;
4     return function foo() { };
5 }
6 bar( );
7 console.log(foo);

二.

1 var foo = 1;
2 function bar() {
3     foo = 10;            
4     return;
5     function foo() {};
6 }
7 bar();
8 console.log(foo);

三.

1 var a = 1;
2 function fn() {
3     console.log(a);
4 var a = 2; 5 } 6 fn(); 7 console.log(a);

四.

1 var a = 1;
2 function fn(a) {
3     console.log(a);
4     var a = 2;
5 }
6 fn(a);
7 console.log(a);

哈哈,是不是so easy,以下是小編的理解,如果有誤,還望大神指出喔 ^_^

一.

JS 函數作用域及變量提升那些事!