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