作用域是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。很慚愧,我今天才深入理解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中為什麼會出現塊級作用域的概念,那還要問let
和const
兩兄弟。
使用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...