成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【轉(zhuǎn)】javascript:with的用法以及延長(zhǎng)作用域鏈

weapon / 1717人閱讀

摘要:來看一下語(yǔ)句的作用通俗的說,就是引用對(duì)象,并對(duì)該對(duì)象上的屬性進(jìn)行操作,其作用是可以省略重復(fù)書寫該對(duì)象名稱,起到簡(jiǎn)化書寫的作用。

原文鏈接:https://www.cnblogs.com/zz334...

《Javascript高級(jí)程序設(shè)計(jì)(第二版)》第66頁(yè)中提到:“由于with語(yǔ)句的變量對(duì)象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回?!保恢勒l(shuí)看完覺得一頭霧水?

第三版中75頁(yè)則更是難懂:“至于with語(yǔ)句內(nèi)部,則定義了一個(gè)url的變量,因此url就成了函數(shù)執(zhí)行環(huán)境的一部分,所以可以作為函數(shù)的值被返回”

首先來看看他舉的例子:

function buildUrl(){  
     var qs="?debug=true";  
     with(location){  
          var url=href+qs;  
     }  
     return url;  
}  
var result=buildUrl();  
  
alert(result);  

如果你沒讀過著本書,并且需要學(xué)習(xí)javascript,請(qǐng)思考并嘗試運(yùn)行該例子。
最后彈出的不是undefined,而是你的靜態(tài)頁(yè)地址+qs的值。

來看一下with語(yǔ)句的作用:

通俗的說,就是引用對(duì)象,并對(duì)該對(duì)象上的屬性進(jìn)行操作,其作用是可以省略重復(fù)書寫該對(duì)象名稱,起到簡(jiǎn)化書寫的作用。

但是有幾個(gè)問題需要注意:

1、with代碼塊中,javascript引擎對(duì)變量的處理方式是:先查找是不是該對(duì)象的屬性,如果是,則停止。如果不是繼續(xù)查找是不是局部變量。(在《Javascript高級(jí)程序設(shè)計(jì)(第二版)》中提到的觀點(diǎn),跟這一點(diǎn)恰好相反,但是實(shí)例可證明其是錯(cuò)誤的,會(huì)在接下來介紹)

2、就算在with語(yǔ)句中使用 var 運(yùn)算符重新定義變量(該變量是with引用對(duì)象的屬性),如果該屬性是可寫屬性,那么也會(huì)給對(duì)象的屬性賦值。

3、如果你想通過with語(yǔ)句,對(duì)引用對(duì)象添加多個(gè)屬性,并為每個(gè)屬性賦值,這是不可能的!也就是說,要賦值的只能是對(duì)象已經(jīng)存在并且可以寫入的屬性(不能是只讀屬性)。

再來看看開頭提到的那句話

“由于with語(yǔ)句的變量對(duì)象是只讀的,結(jié)果url就成了函數(shù)執(zhí)行環(huán)境的一部分,因而可以作為函數(shù)的值被返回。”

反過來:如果with語(yǔ)句的變量對(duì)象是可寫入的…… 剛才第3點(diǎn)提過,不能給對(duì)象寫入原來不存在的屬性,先這樣理解,下面還有另外的含義。

那延長(zhǎng)作用域鏈又是怎么回事?

一般的,“由于with語(yǔ)句塊中作用域的‘變量對(duì)象’是只讀的,所以在他本層定義的標(biāo)識(shí)符,不能存儲(chǔ)到本層,而是存儲(chǔ)到它的上一層作用域”。這里又要理解有一層“只讀”的含義。

在Javascript的作用域中(作用域,想想就是函數(shù)塊,每個(gè)函數(shù)都會(huì)有個(gè)函數(shù)名,就算是匿名函數(shù)也有個(gè)空函數(shù)名),那么創(chuàng)建作用域的時(shí)候,本層的標(biāo)識(shí)符就可以寄托在這個(gè)作用域下,而with語(yǔ)句塊中作用域的‘變量對(duì)象’是只讀的,不能存儲(chǔ)標(biāo)識(shí)符,只能存儲(chǔ)在其上一層,這就是延長(zhǎng)作用域鏈。其實(shí),這和上面說的不能給對(duì)象添加屬性有同工之處。

其實(shí),完全可以這樣理解,在Javascript中,沒有塊級(jí)作用域,就是說除了函數(shù),其他的塊級(jí)代碼都沒有自己的作用域。

現(xiàn)在說一下之前提到的with代碼塊中變量處理方式的問題

用事實(shí)說話:

var o={href:"sssss"};  
var href="1111";  
function buildUrl(){  
     var qs="?debug=true";       
     with(o){  
          href="2222";  
          var url=href+qs;  
     }      
     return url;  
}  
var result=buildUrl();  
alert(result);  //2222?debug=true
alert(href);  //1111

很明顯,with語(yǔ)句中并沒有更改變量href的值,而是更改了 o 對(duì)象的 href 屬性。

就是說,with中首先查找的是相關(guān)對(duì)象的屬性,如果沒有,才改變變量的值。

將以上例子o對(duì)象的href屬性去掉

var o={};  
var href="1111";  
function buildUrl(){  
     var qs="?debug=true";       
     with(o){  
          href="2222";  
          var url=href+qs;  
     }      
     return url;  
}  
var result=buildUrl();  
alert(result);  //2222?debug=true
alert(href); //2222

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103727.html

相關(guān)文章

  • JavaScript作用域鏈

    摘要:而作用域鏈則控制著變量與函數(shù)的可見性和生命周期。三延長(zhǎng)作用域鏈在中,和關(guān)鍵字能延長(zhǎng)作用域鏈,對(duì)來說,將會(huì)指定一個(gè)只讀對(duì)象添加到作用域鏈中。 本文共 1200 字,讀完只需 4 分鐘 概述 JavaScript 中的可執(zhí)行代碼有其執(zhí)行上下文,在執(zhí)行上下文中,有三個(gè)重要的元素: 變量對(duì)象(variable object) 作用域鏈(scope chain) this 其中,變量對(duì)象是上...

    Karrdy 評(píng)論0 收藏0
  • Javascript執(zhí)行環(huán)境和作用注意要點(diǎn)

    摘要:所以,全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。搜索過程從作用域鏈的最前端開始,逐級(jí)向后回溯,直到找到標(biāo)識(shí)符為止。查詢標(biāo)識(shí)符搜索過程就是沿作用域鏈向上查詢的過程。 執(zhí)行環(huán)境 執(zhí)行環(huán)境就是環(huán)境,是js中最重要的概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù)。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)的變量對(duì)象(我們編寫的代碼無法訪問這個(gè)對(duì)象)。 全局執(zhí)行環(huán)境(是最外圍的執(zhí)行環(huán)境。在W...

    CKJOKER 評(píng)論0 收藏0
  • 【JS. ES5重點(diǎn)筆記】執(zhí)行環(huán)境和作用

    摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。如果在局部環(huán)境中沒有找到該變量名,則繼續(xù)沿作用域鏈向上搜索。 【JavaScript.ES5】執(zhí)行環(huán)境和作用域 參考文獻(xiàn): Nicholas C.Zakas 《JavaScript》高級(jí)程序設(shè)計(jì) 僅為個(gè)人學(xué)習(xí)參考文獻(xiàn)的內(nèi)容記錄的筆記。存...

    Jeffrrey 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)系列---執(zhí)行環(huán)境與作用域鏈

    摘要:延長(zhǎng)作用域鏈下面兩種語(yǔ)句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象以延長(zhǎng)作用域鏈, 問題 今天看筆記發(fā)現(xiàn)自己之前記了一個(gè)關(guān)于同名標(biāo)識(shí)符優(yōu)先級(jí)的內(nèi)容,具體是下面這樣的: 形參優(yōu)先級(jí)高于當(dāng)前函數(shù)名,低于內(nèi)部函數(shù)名 形參優(yōu)先級(jí)高于arguments 形參優(yōu)先級(jí)高于只聲明卻未賦值的局部變量,但是低于聲明且賦值的局部變量 函數(shù)和變量都會(huì)聲明提升,函數(shù)名和變量名同名時(shí),函數(shù)名的優(yōu)先級(jí)要高。執(zhí)行代...

    J4ck_Chan 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)(第3版)》——變量、作用域和內(nèi)存問題(四)

    摘要:執(zhí)行環(huán)境的類型有兩種全局全局執(zhí)行環(huán)境局部函數(shù)執(zhí)行環(huán)境每個(gè)環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù)名但任何環(huán)境都不能通過向下搜索作用域鏈而進(jìn)入另一個(gè)執(zhí)行環(huán)境。內(nèi)部可通過作用域鏈訪問外部,外部不能訪問內(nèi)部。 變量、作用域和內(nèi)存問題 ECMAScript 數(shù)據(jù)類型 基本類型(5種): Undefined,Null,Boolean,Number,String typeof() 檢測(cè)...

    YacaToy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<