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

贊助商

分類目錄

贊助商

最新文章

搜索

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

作者:admin    時間:2022-6-8 21:31:26    瀏覽:

JavaScript里this關(guān)鍵字在函數(shù)調(diào)用里的值是什么?全局對象?undefined?其實都對。在本文中,將通過多個示例進行詳細介紹。

this在函數(shù)調(diào)用中是全局對象

全局對象由執(zhí)行環(huán)境決定,在瀏覽器中,全局對象是window對象。

 this在函數(shù)調(diào)用中是全局對象

在函數(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)用中,thisundefined。執(zhí)行上下文不再是全局對象。 

 嚴(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)用時,thisundefined

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

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

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