全域性作用域 函式作用域 塊級作用域的理解

2021-09-13 11:50:29 字數 2099 閱讀 9453

作用域是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。很慚愧,我今天才深入理解js的作用域..我不配做乙個程式設計師.. 開玩笑,什麼時候理解都不晚,重要的是理解了以後能不能深深地扎在記憶裡,不能,那就寫下來
在乙個**塊(括在一對花括號中的一組語句)中定義的所有變數在**塊的外部是不可見的。
es6中新增的概念,在es5中是沒有的,es5中沒有? 沒有的時候我們**也寫的好好的,現在新增的概念,我不用不行嗎? 來,拋乙個典型的問題出來,你就明白塊級作用域出現的重要性了。

var i = 100;                //全域性變數

for(var i = 0;i < 5; i++){}

console.log("i =",i); //i = 5

我們用i變數只想在for迴圈中使用,並沒有想要修改全域性變數的意思。你可能會說誰會用i做全域性變數啊,那個全域性變數i只是為了突出這個例子,修改全域性變數事小,洩露成全域性變數才是我們擔心的。怎麼辦?在es5時代,還沒有塊級作用域這個概念,但是當時也有一種解決方法,那就是..

....

....

對,閉包,用後即焚:

var i = 100;                //全域性變數

(function()

})()

console.log("i =",i); //i = 100

es6中為什麼會出現塊級作用域的概念,那還要問letconst兩兄弟。

使用let和const以後會發現,他們宣告的變數作用域範圍不會超過{}這個圈

for(let i = 0; i < 5; i++){};

console.log("i =",i); //i is not defined

let 對比之前 var 宣告的變數總結有以下幾點不同:

console.log(a);           //uncaught referenceerror: a is not defined

console.log(a); //1

let a = 1;

let a = 2; //uncaught syntaxerror: identifier 'a' has already been declared

var a = 1;

var a = 2; // a = 2

// 大括號中a使let宣告,所以只能在宣告後使用(不存在宣告提前,a = undefined的情況)

var a = 10;

// 大括號中a使var宣告

var a = 10;

window.a = 1;

var a = 2 ;

console.log(a); // 2

console.log(window.a); // 2

window.b = 1;

let b = 2 ;

console.log(b); // 2

console.log(window.b); // 1

const 宣告的物件,是可以修改內部屬性的,陣列同理;

主要總結一下塊級作用域、以及塊級作用域出現的意義,方便更好的記住。

let 和 const 產生一定有它的意義,es6其他的新特性也一樣。

其他特性會在接下來總結。

全域性作用域 塊級作用域

瀏覽器環境有一頂層物件window,window的屬性和var的全域性變數等價。如果用var設定了window物件的內建屬性作為變數,內建屬性值將會被覆蓋。如果是window物件的內建屬性,輸出預設值 非內建則輸出underfined。console.log window.name window.n...

塊級作用域與函式作用域

函式作用域 變數在定義的環境中以及巢狀的子函式中處處可見 塊級作用域 變數在離開定義的塊級 後立即被 在es6之前,js的作用域只有兩種 函式作用域和全域性作用域。使用var宣告的變數,都存在變數提公升的過程。console.log a undefined console.log c undefin...

Python作用域 全域性作用域 區域性作用域

在python中,每個函式都會建立乙個作用域。pythonistas也可能稱函式擁有它們自己的命名空間 namespace 這意味著當在函式體裡遇到變數名 時,python首先在該函式的命名空間中查詢,python包含了一些讓我們檢視命名空間的函式。讓我們寫乙個簡單的函式來探查一下local和glo...