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