摘要:當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。可以指向不同的運行環境,這里的運行環境本質上指的是對象,可以是內建對象自定義對象或者全局對象。
今天早上看到公眾號推送了阮一峰老師的文章JavaScript 的 this 原理,文章不是很長于是研究了一下。
看完自己的總結如下:
thisthis 指向函數運行時所在的環境。
函數運行在對象內,this 就指向該對象
運行在全局環境,this 就指向全局環境
js 允許函數體內部引用當前環境外的其他變量,由于函數可以在不同運行環境執行,“當前環境外的其他變量”就是指“不同運行環境中的變量” ,那么這個時候就需要有一種機制,能夠在函數體內部獲得當前的運行環境,所以 ==this== 就應運而生了。
看到 ==js 允許函數體內部引用當前環境外的其他變量== 想到之前自己總結過的關于作用域的知識點:
作用域函數定義的時候就被確定了作用域,與它在什么地方被調用執行無關
當前作用域沒有定義的變量,即自由變量,會到父級作用域中查找,和執行作用域無關;
令我產生困惑的兩句話:
函數定義的時候就被確定了作用域,和執行作用域無關
js 允許函數體內部引用當前環境外的其他變量
這里的 ==執行作用域== 與下文的 ==當前環境外的其他變量== 如何理解或者做區分?
翻閱紅寶書(第三版)p73,執行環境是 js 中最為重要的一個概念,總結如下:
函數的運行環境即其執行環境
每個函數都有自己的執行環境,執行環境定義了函數有權訪問的其他數據,保存在變量對象之中。
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。作用域鏈決定了訪問變量對象的順序。
this 可以指向不同的運行環境,這里的運行環境本質上指的是對象,可以是內建對象、自定義對象或者全局對象。
函數定義時就被確定了作用域,這個作用域決定了其訪問變量對象的順序。而函數可以在不同環境被執行,這里的 ==不同環境== (可能是外層函數或者全局環境下)的作用域才是執行作用域。
所以 執行作用域 可以理解為 函數執行位置外部函數或者全局環境的作用域, 與函數自己的作用域(聲明時就被確定了) 完全是兩碼事
當前環境外的其他變量即函數自己作用域外的其他變量
函數要想引用 當前環境外的其他變量 只能用 this ,this 指向當前運行環境,運行在對象內就指向對象,運行在全局環境就指向全局對象
咦,我自己怎么也有點亂。。
運行在全局環境的 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 這和模塊化的設計又有什么關系?
發人深思...
天色已晚,且聽下回分解。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95747.html
摘要:問題是,他們有沒有一種默認的文化或深思熟慮的文化這個不同就是計劃與遠見。沒有一個強壯的為什么,對于如何創造一個強壯和深思熟慮的文化會很難。一種可以幫助簡歷并保持一種深思熟慮的文化的方式,是雇傭是同時考察技能與價值觀。 原文: https://www.linkedin.com/wuko...翻譯: 麥芽面包 在商業和咨詢界文化最近變成了一個很火的話題。當你提到這個話題時每個人都會變得很...
摘要:線上出現了一個問題同步某一功能的數據的時候,同一主鍵的數據會發多次。拋出主鍵沖突的異常。綜合上述的描述,目前要解決的事情有并發。數據存儲順序前提有標識能區分最新數據。基于上述描述準備用語句,用數據庫層面的事物來保證數據的一致性。 線上出現了一個問題:mq同步某一功能的數據的時候,同一主鍵的數據會發多次。業務邏輯是,某一條數據過來后,我會先去數據庫查是否存在了此uuid的數據,如果有的話...
閱讀 475·2024-11-07 18:25
閱讀 130815·2024-02-01 10:43
閱讀 951·2024-01-31 14:58
閱讀 916·2024-01-31 14:54
閱讀 83027·2024-01-29 17:11
閱讀 3287·2024-01-25 14:55
閱讀 2076·2023-06-02 13:36
閱讀 3189·2023-05-23 10:26