摘要:當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。可以指向不同的運行環(huán)境,這里的運行環(huán)境本質(zhì)上指的是對象,可以是內(nèi)建對象自定義對象或者全局對象。
今天早上看到公眾號推送了阮一峰老師的文章JavaScript 的 this 原理,文章不是很長于是研究了一下。
看完自己的總結(jié)如下:
thisthis 指向函數(shù)運行時所在的環(huán)境。
函數(shù)運行在對象內(nèi),this 就指向該對象
運行在全局環(huán)境,this 就指向全局環(huán)境
js 允許函數(shù)體內(nèi)部引用當前環(huán)境外的其他變量,由于函數(shù)可以在不同運行環(huán)境執(zhí)行,“當前環(huán)境外的其他變量”就是指“不同運行環(huán)境中的變量” ,那么這個時候就需要有一種機制,能夠在函數(shù)體內(nèi)部獲得當前的運行環(huán)境,所以 ==this== 就應運而生了。
看到 ==js 允許函數(shù)體內(nèi)部引用當前環(huán)境外的其他變量== 想到之前自己總結(jié)過的關(guān)于作用域的知識點:
作用域函數(shù)定義的時候就被確定了作用域,與它在什么地方被調(diào)用執(zhí)行無關(guān)
當前作用域沒有定義的變量,即自由變量,會到父級作用域中查找,和執(zhí)行作用域無關(guān);
令我產(chǎn)生困惑的兩句話:
函數(shù)定義的時候就被確定了作用域,和執(zhí)行作用域無關(guān)
js 允許函數(shù)體內(nèi)部引用當前環(huán)境外的其他變量
這里的 ==執(zhí)行作用域== 與下文的 ==當前環(huán)境外的其他變量== 如何理解或者做區(qū)分?
翻閱紅寶書(第三版)p73,執(zhí)行環(huán)境是 js 中最為重要的一個概念,總結(jié)如下:
函數(shù)的運行環(huán)境即其執(zhí)行環(huán)境
每個函數(shù)都有自己的執(zhí)行環(huán)境,執(zhí)行環(huán)境定義了函數(shù)有權(quán)訪問的其他數(shù)據(jù),保存在變量對象之中。
當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。作用域鏈決定了訪問變量對象的順序。
this 可以指向不同的運行環(huán)境,這里的運行環(huán)境本質(zhì)上指的是對象,可以是內(nèi)建對象、自定義對象或者全局對象。
函數(shù)定義時就被確定了作用域,這個作用域決定了其訪問變量對象的順序。而函數(shù)可以在不同環(huán)境被執(zhí)行,這里的 ==不同環(huán)境== (可能是外層函數(shù)或者全局環(huán)境下)的作用域才是執(zhí)行作用域。
所以 執(zhí)行作用域 可以理解為 函數(shù)執(zhí)行位置外部函數(shù)或者全局環(huán)境的作用域, 與函數(shù)自己的作用域(聲明時就被確定了) 完全是兩碼事
當前環(huán)境外的其他變量即函數(shù)自己作用域外的其他變量
函數(shù)要想引用 當前環(huán)境外的其他變量 只能用 this ,this 指向當前運行環(huán)境,運行在對象內(nèi)就指向?qū)ο螅\行在全局環(huán)境就指向全局對象
咦,我自己怎么也有點亂。。
運行在全局環(huán)境的 this眾所周知,瀏覽器環(huán)境下 全局環(huán)境下的 this 就是 window,沒有一點問題
// 瀏覽器環(huán)境下 var a = "a" this.b = "b" console.log(this.a) // a console.log(b) // b console.log(this===window) // true但是...
// node 環(huán)境下 var x = "xx" global.y = "yy" // node 環(huán)境下輸出 console.log(y); // yy global 屬性掛載到了全局環(huán)境, console.log(global.x) // undefined 全局環(huán)境中定義的x 變量并沒有掛載到頂層對象global對象中 console.log(this === global) // false console.log(JSON.stringify(this))// {} 空對象,并不是 global
查閱MDN發(fā)現(xiàn):
// node 環(huán)境下 function f1() { return this } console.log(f1() === global) // true console.log(this === global) // false
node 環(huán)境下只有定義在函數(shù)內(nèi)部的 this 才指向 global ?
那么, node 環(huán)境下 this 到底指向什么?經(jīng)過和導師的溝通
終于發(fā)現(xiàn)
// node 環(huán)境下 this.num = "10" global.test = "12" console.log(module.exports) // {num: "10"} console.log(this===module.exports) // true
那么 node 環(huán)境下 this 為什么指向 module.exports 這和模塊化的設(shè)計又有什么關(guān)系?
發(fā)人深思...
天色已晚,且聽下回分解。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95747.html
摘要:問題是,他們有沒有一種默認的文化或深思熟慮的文化這個不同就是計劃與遠見。沒有一個強壯的為什么,對于如何創(chuàng)造一個強壯和深思熟慮的文化會很難。一種可以幫助簡歷并保持一種深思熟慮的文化的方式,是雇傭是同時考察技能與價值觀。 原文: https://www.linkedin.com/wuko...翻譯: 麥芽面包 在商業(yè)和咨詢界文化最近變成了一個很火的話題。當你提到這個話題時每個人都會變得很...
摘要:線上出現(xiàn)了一個問題同步某一功能的數(shù)據(jù)的時候,同一主鍵的數(shù)據(jù)會發(fā)多次。拋出主鍵沖突的異常。綜合上述的描述,目前要解決的事情有并發(fā)。數(shù)據(jù)存儲順序前提有標識能區(qū)分最新數(shù)據(jù)。基于上述描述準備用語句,用數(shù)據(jù)庫層面的事物來保證數(shù)據(jù)的一致性。 線上出現(xiàn)了一個問題:mq同步某一功能的數(shù)據(jù)的時候,同一主鍵的數(shù)據(jù)會發(fā)多次。業(yè)務邏輯是,某一條數(shù)據(jù)過來后,我會先去數(shù)據(jù)庫查是否存在了此uuid的數(shù)據(jù),如果有的話...
閱讀 289·2024-11-07 18:25
閱讀 130366·2024-02-01 10:43
閱讀 868·2024-01-31 14:58
閱讀 828·2024-01-31 14:54
閱讀 82766·2024-01-29 17:11
閱讀 3048·2024-01-25 14:55
閱讀 1985·2023-06-02 13:36
閱讀 3033·2023-05-23 10:26