|
|
|
|
|
JavaScript里this
關(guān)鍵字在函數(shù)調(diào)用里的值是什么?全局對象?undefined?其實都對。在本文中,將通過多個示例進行詳細介紹。
this在函數(shù)調(diào)用中是全局對象
全局對象由執(zhí)行環(huán)境決定,在瀏覽器中,全局對象是window
對象。
在函數(shù)調(diào)用中,執(zhí)行上下文是全局對象。
讓我們看看以下函數(shù)中的上下文:
function sum(a, b) {
console.log(this === window); // => true
this.myNumber = 20; // 添加 'myNumber' 屬性到全局對象
return a + b;
}
// sum() 作為函數(shù)被調(diào)用
// sum() 里的 this 是一個全局對象(window)
sum(15, 16); // => 31
window.myNumber; // => 20
調(diào)用sum(15, 16)
時,JavaScript 自動設(shè)置this
為全局對象(window在瀏覽器中)。
當(dāng)this
在任何函數(shù)作用域(最頂層作用域:全局執(zhí)行上下文)之外使用時,它也等于全局對象:
console.log(this === window); // => true
this.myString = 'Hello World!';
console.log(window.myString); // => 'Hello World!'
<!-- 在HTML文件里 -->
<script type="text/javascript">
console.log(this === window); // => true
</script>
嚴(yán)格模式下,函數(shù)調(diào)用中的this是undefined
從ECMAScript 5.1開始可以使用嚴(yán)格模式,這是 JavaScript 的受限變體。它提供了更好的安全性和更強的錯誤檢查。
要啟用嚴(yán)格模式,請將指令'use strict
'放在函數(shù)體的頂部。
一旦啟用,嚴(yán)格模式會影響執(zhí)行上下文,在常規(guī)函數(shù)調(diào)用中,this
為undefined
。執(zhí)行上下文不再是全局對象。
以嚴(yán)格模式調(diào)用的函數(shù)示例:
function multiply(a, b) {
'use strict'; // 啟用嚴(yán)格模式
console.log(this === undefined); // => true
return a * b;
}
// multiply() 函數(shù)在嚴(yán)格模式下調(diào)用
// multiply() 里的 this 是 undefined
multiply(2, 5); // => 10
當(dāng)multiply(2, 5)
在嚴(yán)格模式下作為函數(shù)調(diào)用時,this
是undefined
。
嚴(yán)格模式不僅在當(dāng)前范圍內(nèi)有效,而且在內(nèi)部范圍內(nèi)(對于內(nèi)部聲明的所有函數(shù))也有效:
function execute() {
'use strict';
function concat(str1, str2) {
// 啟用了嚴(yán)格模式
console.log(this === undefined); // => true
return str1 + str2;
}
// concat() 函數(shù)在嚴(yán)格模式下調(diào)用
// concat() 里的 this 是 undefined
concat('Hello', ' World!'); // => "Hello World!"
}
execute();
'use strict
'位于execute
函數(shù)內(nèi)的頂部,在其范圍內(nèi)啟用嚴(yán)格模式。因為concat
是在execute
作用域內(nèi)聲明的,所以繼承了嚴(yán)格模式。并且調(diào)用concat('Hello', ' World!')
使this
是undefined
。
同時包含嚴(yán)格模式和非嚴(yán)格模式
單個 JavaScript 文件可能同時包含嚴(yán)格模式和非嚴(yán)格模式。因此,對于相同的調(diào)用類型,在單個腳本中可能具有不同的上下文行為:
function nonStrictSum(a, b) {
// 非嚴(yán)格模式
console.log(this === window); // => true
return a + b;
}
function strictSum(a, b) {
'use strict';
// 嚴(yán)格模式
console.log(this === undefined); // => true
return a + b;
}
// nonStrictSum() 函數(shù)在非嚴(yán)格模式中調(diào)用
// nonStrictSum() 里的 this 是 window 對象
nonStrictSum(5, 6); // => 11
// strictSum() 函數(shù)以嚴(yán)格模式調(diào)用
// strictSum() 里的 this 是 undefined
strictSum(8, 12); // => 20
總結(jié)
本文通過多個示例,詳細介紹了一個函數(shù)在嚴(yán)格和非嚴(yán)格模式下調(diào)用時,其里面的this
值是不同的,我們應(yīng)該對此有所了解,在使用時就不會出錯。
相關(guān)文章