修改詞法作用域的兩種方式:eval | with

一.欺騙詞法作用域

1.eval

eval函數(shù)可以接收一個字符串作為參數(shù),以動態(tài)形式插入程序的某個位置趟薄,并對其詞法作用域的環(huán)境進(jìn)行修改。(可在運行期修改書寫期的詞法作用域)

function foo(str,a){
    eval(str);
    console.log(a,b);
}
var b = 2;
foo('var b = 5;',1);
>>>1 5

②詞法作用域是什么?

簡單來說,詞法作用域就是定義在詞法階段的作用域绕娘。換句話說,詞法作用域是由你在寫代碼時將變量和塊作用域?qū)懺谀睦飦頉Q定的栽连。因此险领,當(dāng)詞法分析器處理代碼時會保持作用域不變(大部分情況下這樣)。

③在嚴(yán)格模式下秒紧, eval()函數(shù)在運行時擁有自己的詞法作用域绢陌。這意味著其中的聲明無法修改所在的作用域。

function foo(str,a){
    "use strict"
    eval(str);
    console.log(a,b);
}
var b = 2;
foo('var b = 5;',1);
>>>1 2

function foo(str,a){
    "use strict"
    eval(str);
    console.log(a,b);
}
foo('var b = 5;',1);
>>>Uncaught ReferenceError: b is not defined

2.with

with通常被當(dāng)做重復(fù)引用同一個對象中的多個屬性的快捷方式熔恢,可以不需要重復(fù)引用對象本身:

var obj = {
    a: 1,
    b: 2,
    c: 3
};

obj.a = 2;
obj.b = 3;
obj.c = 4;

with(obj) {
    a = 3;
    b = 4;
    c = 5;
}

②實際上不僅僅是為了方便地訪問對象屬性:

function foo(obj){
    with(obj){
        a = 2;
    }
}
var o1 = {
     a: 3
};
var o2 = {
     b: 3
};
foo(o1);
o1.a;
>>>2

foo(o2);
o2.a;
>>>undefined

a;
>>>2
//a被泄露到全局作用域中脐湾。因為,在非嚴(yán)格模式下叙淌,若a=2中的變量a未聲明秤掌,
也就是在任何作用域中都查找不到變量a,那么就會在全局作用域中創(chuàng)建一個變量a鹰霍,并將2賦值于它机杜。
fooo1().png
foo(o2).png

③盡管with塊可以將一個對象處理為詞法作用域,但是這個塊內(nèi)部正常的變量聲明并不會被限制在這個塊的作用域中衅谷,而是被添加到with所處的函數(shù)的作用域中。

④with聲明實際上是根據(jù)你傳遞給它的對象憑空創(chuàng)建了一個全新的詞法作用域似将。

⑤當(dāng)我們傳遞對象o1with時获黔,with所聲明的作用域是o1蚀苛,而這個作用域中含有一個與o1.a屬性同名的標(biāo)識符。但當(dāng)我們將o2對象作為作用域時玷氏,其中沒有a標(biāo)識符堵未,因此進(jìn)行了正常的LHS (Left Hand Side)查找,[最后導(dǎo)致創(chuàng)建了一個全局變量a并賦值為2]盏触。

⑥本質(zhì)上:通過將一個對象的引用當(dāng)成作用域來處理渗蟹,將對象的屬性當(dāng)成作用域中的標(biāo)識符來處理,從而創(chuàng)建了一個新的詞法作用域赞辩。(同樣也在運行時)

3.性能

①JavaScript引擎會在編譯階段進(jìn)行數(shù)項的性能優(yōu)化雌芽。其中有些優(yōu)化依賴與能夠根據(jù)代碼的詞法進(jìn)行靜態(tài)分析,并預(yù)先確定所有變量和函數(shù)的定義位置辨嗽,才能在執(zhí)行過程中快速找到標(biāo)識符世落。但是eval()with的存在影響了引擎的性能。

eval()with還有個問題是:會被嚴(yán)格模式限制糟需。所以屉佳,避免使用它們。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲押,一起剝皮案震驚了整個濱河市武花,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杈帐,老刑警劉巖体箕,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娘荡,居然都是意外死亡干旁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門炮沐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來争群,“玉大人,你說我怎么就攤上這事大年』槐。” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵翔试,是天一觀的道長轻要。 經(jīng)常有香客問我,道長垦缅,這世上最難降的妖魔是什么冲泥? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上凡恍,老公的妹妹穿的比我還像新娘志秃。我一直安慰自己,他們只是感情好嚼酝,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布浮还。 她就那樣靜靜地躺著,像睡著了一般闽巩。 火紅的嫁衣襯著肌膚如雪钧舌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天涎跨,我揣著相機(jī)與錄音洼冻,去河邊找鬼。 笑死六敬,一個胖子當(dāng)著我的面吹牛碘赖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播外构,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼普泡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了审编?” 一聲冷哼從身側(cè)響起撼班,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垒酬,沒想到半個月后砰嘁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡勘究,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年矮湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口糕。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缅阳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出景描,到底是詐尸還是另有隱情十办,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布超棺,位于F島的核電站向族,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棠绘。R本人自食惡果不足惜件相,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一再扭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧适肠,春花似錦霍衫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澄干。三九已至逛揩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間麸俘,已是汗流浹背辩稽。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留从媚,地道東北人逞泄。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像拜效,于是被迫代替她去往敵國和親喷众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持紧憾,譯者再次奉上一點點福利:阿里云產(chǎn)品券到千,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,394評論 0 11
  • 特別說明赴穗,為便于查閱憔四,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 550評論 0 3
  • 在之前我們講過,將作用域定義成“一套規(guī)則”般眉,這套規(guī)則用于管理引擎如何在當(dāng)前作用域以及嵌套的子作用域中根據(jù)標(biāo)識符名稱...
    我就是z閱讀 1,044評論 4 9
  • 一甸赃、理解js作用域 1柿汛、作用域:作用域是一套規(guī)則,用于確定在何處以及如何查找變量(標(biāo)字符)辑奈。2苛茂、LHS查詢:查找的...
    懷念不能閱讀 457評論 0 1
  • 生活中有很多事情都不能達(dá)到完美妓羊,也不是什么事情都順心順意,也不是所做的每一件事情都能有人理解你稍计,不是你所認(rèn)為的好就...
    子耳子耳閱讀 907評論 0 1