技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類(lèi)目錄

贊助商

最新文章

搜索

[示例]this在函數(shù)調(diào)用里的值是全局對(duì)象還是undefined?

作者:admin    時(shí)間:2022-6-8 21:31:26    瀏覽:

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ì)象。

 this在函數(shù)調(diào)用中是全局對(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)用中,thisundefined。執(zhí)行上下文不再是全局對(duì)象。 

 嚴(yán)格模式下,函數(shù)調(diào)用中的this是undefined

以嚴(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í),thisundefined

嚴(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!')使thisundefined。

同時(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)文章

標(biāo)簽: this  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */