有關(guān)js的變量作用域和this指針的討論
更新時間:2010年12月16日 22:30:24 作者:
在ECMAScript中,只有兩種執(zhí)行環(huán)境,全局環(huán)境和函數(shù)環(huán)境,每個函數(shù)都是一個執(zhí)行環(huán)境,包括嵌套函數(shù)。換句話說,其他情況下即使變量聲明在一對大括號中,在括號外部仍然可以訪問這些變量
一、變量作用域:[P71]
這一句話說的非常精辟:“在ECMAScript中,只有兩種執(zhí)行環(huán)境,全局環(huán)境和函數(shù)環(huán)境,每個函數(shù)都是一個執(zhí)行環(huán)境,包括嵌套函數(shù)。換句話說,其他情況下即使變量聲明在一對大括號中,在括號外部仍然可以訪問這些變量”。以下給出例子:
for(var i=0; i<5; i++) {
var num = 20; // 在for語句中聲明的變量
}
alert(num); // 在for語句外部調(diào)用變量,仍然可以得到num的值
對異常語句也同樣可以:
try {
var num = 20; // 在try語句中聲明的變量
a = b; // 引起一個異常
} catch(e) {
alert(num); // 在catch語句中調(diào)用變量,將得到20
} finally {
alert(num); // 在finally語句中調(diào)用變量,將得到20
}
alert(num); // 在try語句外部調(diào)用變量,將得到20
除了上面所演示的這兩種語句外,一對大括號也無法構(gòu)成一個執(zhí)行環(huán)境,例如:
{ var num = 1;3 }
二、this指針:[P83]
在這里列出this在ECMAScript中的不同含義:
(1) 在全局執(zhí)行環(huán)境中使用this,表示Global對象,在瀏覽器中就是window對象。
(2) 當(dāng)在函數(shù)執(zhí)行環(huán)境中使用this時,情況就有些復(fù)雜了。如果函數(shù)沒有明顯的作為非window對象的屬性,而只是定義了函數(shù),不管這個函數(shù)是不是定義在另一個函數(shù)中,這個函數(shù)中的this仍然表示window對象。如果函數(shù)顯示地作為一個非window對象的屬性,那么函數(shù)中的this就代表這個對象。(當(dāng)然可以使用apply或者call函數(shù)來取代默認(rèn)this的引用,詳見[P88])
(3) 當(dāng)通過new運算符來調(diào)用函數(shù)時,函數(shù)被當(dāng)做一個構(gòu)造函數(shù),this指向構(gòu)造函數(shù)創(chuàng)建出來的對象。
參考:
《JavaScript基礎(chǔ)與案例開發(fā)詳解》清華大學(xué)出版社
這一句話說的非常精辟:“在ECMAScript中,只有兩種執(zhí)行環(huán)境,全局環(huán)境和函數(shù)環(huán)境,每個函數(shù)都是一個執(zhí)行環(huán)境,包括嵌套函數(shù)。換句話說,其他情況下即使變量聲明在一對大括號中,在括號外部仍然可以訪問這些變量”。以下給出例子:
復(fù)制代碼 代碼如下:
for(var i=0; i<5; i++) {
var num = 20; // 在for語句中聲明的變量
}
alert(num); // 在for語句外部調(diào)用變量,仍然可以得到num的值
對異常語句也同樣可以:
復(fù)制代碼 代碼如下:
try {
var num = 20; // 在try語句中聲明的變量
a = b; // 引起一個異常
} catch(e) {
alert(num); // 在catch語句中調(diào)用變量,將得到20
} finally {
alert(num); // 在finally語句中調(diào)用變量,將得到20
}
alert(num); // 在try語句外部調(diào)用變量,將得到20
除了上面所演示的這兩種語句外,一對大括號也無法構(gòu)成一個執(zhí)行環(huán)境,例如:
復(fù)制代碼 代碼如下:
{ var num = 1;3 }
二、this指針:[P83]
在這里列出this在ECMAScript中的不同含義:
(1) 在全局執(zhí)行環(huán)境中使用this,表示Global對象,在瀏覽器中就是window對象。
(2) 當(dāng)在函數(shù)執(zhí)行環(huán)境中使用this時,情況就有些復(fù)雜了。如果函數(shù)沒有明顯的作為非window對象的屬性,而只是定義了函數(shù),不管這個函數(shù)是不是定義在另一個函數(shù)中,這個函數(shù)中的this仍然表示window對象。如果函數(shù)顯示地作為一個非window對象的屬性,那么函數(shù)中的this就代表這個對象。(當(dāng)然可以使用apply或者call函數(shù)來取代默認(rèn)this的引用,詳見[P88])
(3) 當(dāng)通過new運算符來調(diào)用函數(shù)時,函數(shù)被當(dāng)做一個構(gòu)造函數(shù),this指向構(gòu)造函數(shù)創(chuàng)建出來的對象。
參考:
《JavaScript基礎(chǔ)與案例開發(fā)詳解》清華大學(xué)出版社
相關(guān)文章
js自動閉合html標(biāo)簽(自動補全html標(biāo)記)
假如我有一個DIV,如果沒有閉合后面的樣式都會亂了,這樣的代碼可能會影響后面的樣式,我希望用JS去自動閉合這種沒有閉合的標(biāo)簽2012-10-10BootStrap daterangepicker 雙日歷控件
這篇文章主要介紹了BootStrap daterangepicker 雙日歷控件,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06微信小程序云開發(fā)實現(xiàn)數(shù)據(jù)添加、查詢和分頁
這篇文章主要為大家詳細(xì)介紹了微信小程序云開發(fā)實現(xiàn)數(shù)據(jù)添加、查詢和分頁,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05