摘要:在腳本中,默認(rèn)指向一個(gè)空對(duì)象,并不是指向,也不是指向。舉個(gè)栗子,在函數(shù)執(zhí)行后,覆蓋原先的值我們?cè)谕獠慷x了一個(gè)名為的全局變量,它會(huì)被默認(rèn)添加到全局的屬性上??偨Y(jié)在不同的執(zhí)行環(huán)境中的默認(rèn)指代通過省略聲明變量導(dǎo)致變量提升現(xiàn)象的發(fā)生及預(yù)防
侃侃JavaScript中的this
this為何如此多變?
this總是跟它的執(zhí)行上下文有關(guān),而在JavaScript總會(huì)有開辟新的執(zhí)行上下文的東西,比如函數(shù),所以,this才如此的變化。
執(zhí)行環(huán)境對(duì)JavaScript中的this有影響嗎?
JavaScript是一門解釋型語(yǔ)言,需要有一個(gè)執(zhí)行環(huán)境去執(zhí)行它,通常的執(zhí)行環(huán)境是瀏覽器,還有node腳本,還有`REPL`(“讀取-求值-輸出”循環(huán)(Read-Eval-Print Loop,簡(jiǎn)稱REPL))。 如果對(duì)REPL有興趣的話,博客中的另一篇文章介紹了`REPL`
this默認(rèn)指代誰(shuí)?
在不同的執(zhí)行環(huán)境中,會(huì)指代不同的對(duì)象
瀏覽器中:
> this // Window {top: Window, window: Window,... > this === window //true > var a = 1; //在全局中,用var聲明變量,會(huì)默認(rèn)給window添加 > this.a // 1 > window.a // 1 > b = 1; //不使用var聲明變量,會(huì)默認(rèn)給全局的this添加屬性 > this.b // 1 > window.b // 1
在node腳本中
console.log(this); //{} console.log(this === global); //false console.log(this === window); //ReferenceError: window is not defined var a = 1; //在全局中,使用var聲明變量,未給global添加屬性 console.log(this.a); //undefined console.log(global.a); //undefined console.log(window.a); //ReferenceError: window is not defined b = 1; //不使用var聲明變量,會(huì)默認(rèn)給全局的global添加屬性。 console.log(this.b); //undefined console.log(global.b); // 1 在node腳本中,this默認(rèn)指向一個(gè)空對(duì)象,并不是指向global,也不是指向window。
在REPL中
> this { DTRACE_NET_SERVER_CONNECTION: [Function], DTRACE_NET_STREAM_END: [Function], ... > global === this //true > var a = 1; //在全局中,使用var聲明變量,會(huì)默認(rèn)給全局的global添加屬性 > this.a // 1 > global.a // 1 > b = 1; //不使用var聲明變量,會(huì)默認(rèn)給全局的this添加屬性 > this.b // 1 > global.b // 1實(shí)例擴(kuò)展
我們對(duì)于省略var的變量聲明方式,我們總說它是不安全的,但是是合法的。
為什么不安全?
如上文所述:不使用var聲明變量,會(huì)讓變量默認(rèn)的添加到了全局的this中,這有時(shí)候會(huì)莫名的給變量提升它的作用域,從而影響其他全局變量。
舉個(gè)栗子:
var position = "outer"; //this.position = "outer" function test(){ position = "inner"; //this.position = "inner",在函數(shù)執(zhí)行后,覆蓋原先的值 console.log(this.position); } test();
我們?cè)谕獠慷x了一個(gè)名為position的全局變量,它會(huì)被默認(rèn)添加到全局this的屬性上。
然后在我們的test函數(shù)中,又定義了一個(gè)同名的變量,但是注意,函數(shù)中的變量聲明沒有用var。
因?yàn)槲覀儾]有對(duì)函數(shù)實(shí)例化,所以this.position的this會(huì)默認(rèn)指代全局。
而當(dāng)我們調(diào)用函數(shù)test時(shí),函數(shù)會(huì)生成一個(gè)執(zhí)行上下文,而內(nèi)部position會(huì)將作用域從函數(shù)內(nèi)部提升到全局,從而覆蓋(污染)了外部全局定義的position變量。
所以,在JavaScript的嚴(yán)格模式中,是不允許省略var來聲明變量的。故在聲明變量的時(shí)候,就順手加上var吧。
總結(jié)this在不同的執(zhí)行環(huán)境中的默認(rèn)指代
通過省略var聲明變量導(dǎo)致“變量提升”現(xiàn)象的發(fā)生及預(yù)防
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91498.html
摘要:構(gòu)造函數(shù)對(duì)于被實(shí)例化的,我們稱之為構(gòu)造函數(shù),及使用關(guān)鍵字調(diào)用的,對(duì)于它們來說,會(huì)被改變,指向?qū)嵗I侠踝尤仲x上屬性通過關(guān)鍵字創(chuàng)建實(shí)例,改變函數(shù)內(nèi)部指向注解通過這個(gè)栗子,我們可以看出,通過創(chuàng)建構(gòu)造函數(shù)的實(shí)例,使得的指向改變,指向了實(shí)例本身。 用栗子說this Bug年年有,今年特別多 對(duì)于JavaScript這么靈活的語(yǔ)言來說,少了this怎么活! function ...
摘要:閉包執(zhí)行上下文決定了變量作用域而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。只要咱們弄明白閉包,其中的自然跑不掉。 閉包 this 執(zhí)行上下文決定了變量作用域 而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。 按慣例,上栗子 var global = glo...
摘要:而在中是迭代器生成器,被創(chuàng)造性的拿來做異步流程控制了。當(dāng)執(zhí)行的時(shí)候,并不執(zhí)行函數(shù)體,而是返回一個(gè)迭代器。行代碼再看看文章開頭的行代碼首先生成一個(gè)迭代器,然后執(zhí)行一遍,得到的是一個(gè)對(duì)象,里面再執(zhí)行。 廣告招人:阿里巴巴招前端,在這里你可以享受大公司的福利和技術(shù)體系,也有小團(tuán)隊(duì)的挑戰(zhàn)和成長(zhǎng)空間。聯(lián)系: qingguang.meiqg at alibaba-inc.com 首先請(qǐng)?jiān)徫业臉?biāo)題...
摘要:寫在前面在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問題。用戶的合法性與數(shù)據(jù)的可見性是數(shù)據(jù)安全中非常重要的一部分。 寫在前面 在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問題。用戶的合法性與數(shù)據(jù)的可見性是數(shù)據(jù)安全中非常重要的一部分。但是,一方面,不同的應(yīng)用對(duì)于數(shù)據(jù)的合法性和可見性要求的維度與粒度都有所區(qū)別;另一方面,以當(dāng)前微服務(wù)、多服務(wù)的架構(gòu)方式,如何共享Sessi...
摘要:橋接模式的核心在于將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化??雌饋磉@個(gè)版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實(shí)現(xiàn)版本這個(gè)實(shí)現(xiàn)包含了三個(gè)函數(shù)。這個(gè)例子體現(xiàn)了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請(qǐng)求的原因?...
閱讀 4045·2021-09-24 10:24
閱讀 1406·2021-09-22 16:01
閱讀 2726·2021-09-06 15:02
閱讀 1028·2019-08-30 13:01
閱讀 1015·2019-08-30 10:52
閱讀 641·2019-08-29 16:36
閱讀 2245·2019-08-29 12:51
閱讀 2341·2019-08-28 18:29