This 指針--沉思

本日早上看到民眾號推送了阮一峰先生的文章JavaScript 的 this 道理,文章不是很長因而研討了一下。

看完本身的總結以下:

this

  • this 指向函數運轉時地點的環境。
  • 函數運轉在對象內,this 就指向該對象
  • 運轉在全局環境,this 就指向全局環境
  • js 許可函數體內部援用當前環境外的其他變量,因為函數可以在差別運轉環境實行,“當前環境外的其他變量”就是指“差別運轉環境中的變量” ,那末這個時刻就需要有一種機制,可以在函數體內部取得當前的運轉環境,所以 ==this== 就應運而生了。

看到 ==js 許可函數體內部援用當前環境外的其他變量== 想到之前本身總結過的關於作用域的知識點:

作用域

  • 函數定義的時刻就被肯定了作用域,與它在什麼地方被挪用實行無關
  • 當前作用域沒有定義的變量,即自在變量,會到父級作用域中查找,和實行作用域無關;

令我發生疑心的兩句話:

  • 函數定義的時刻就被肯定了作用域,和實行作用域無關
  • js 許可函數體內部援用當前環境外的其他變量

這裏的 ==實行作用域== 與下文的 ==當前環境外的其他變量== 怎樣明白或許做辨別?

翻閱紅寶書(第三版)p73,實行環境是 js 中最為主要的一個觀點,總結以下:

  1. 函數的運轉環境即其實行環境
  2. 每一個函數都有本身的實行環境,實行環境定義了函數有權接見的其他數據,保存在變量對象當中。
  3. 當代碼在一個環境中實行時,會建立變量對象的一個作用域鏈。作用域鏈決議了接見變量對象的遞次。
  4. this 可以指向差別的運轉環境,這裏的運轉環境本質上指的是對象,可所以內建對象、自定義對象或許全局對象。
  5. 函數定義時就被肯定了作用域,這個作用域決議了其接見變量對象的遞次。而函數可以在差別環境被實行,這裏的 ==差別環境== (多是外層函數或許全局環境下)的作用域才是實行作用域。
  6. 所以 實行作用域 可以明白為 函數實行位置外部函數或許全局環境的作用域, 與函數本身的作用域(聲明時就被肯定了) 完全是兩回事
  7. 當前環境外的其他變量即函數本身作用域外的其他變量
  8. 函數要想援用 當前環境外的其他變量 只能用 this ,this 指向當前運轉環境,運轉在對象內就指向對象,運轉在全局環境就指向全局對象
  9. 咦,我本身怎樣也有點亂。。

運轉在全局環境的 this

盡人皆知,瀏覽器環境下 全局環境下的 this 就是 window,沒有一點題目

// 瀏覽器環境下
var a = 'a'
this.b = 'b'
console.log(this.a)  // a
console.log(b)      // b
console.log(this===window) // true

然則…

// node 環境下
var x = 'xx'
global.y = 'yy'
// node 環境下輸出
console.log(y);   // yy  global 屬性掛載到了全局環境, 
console.log(global.x) // undefined   全局環境中定義的x 變量並沒有掛載到頂層對象global對象中
console.log(this === global)  // false 
console.log(JSON.stringify(this))// {}  空對象,並非 global

查閱MDN發明:

// node 環境下
function f1() {
    return this
}

console.log(f1() === global) // true  
console.log(this === global) // false

node 環境下只要定義在函數內部的 this 才指向 global ?
那末, node 環境下 this 究竟指向什麼?經由和導師的溝通
終究發明

// node 環境下
this.num = '10'
global.test = '12'
console.log(module.exports) // {num: "10"}    
console.log(this===module.exports) // true

那末 node 環境下 this 為何指向 module.exports 這和模塊化的設想又有什麼關係?

發人深思…

天色已晚,且聽下回分解。

    原文作者:Stanny2017
    原文地址: https://segmentfault.com/a/1190000015418185
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞