js語法中with的學習

首先呢,嚴格模式下with報錯,而且with在js引擎環境下運行緩慢,所以並不建議使用。當然了,通過各種資料,with貌似都是用來拓展作用域,延長作用域鏈,簡化書寫,具體的就不深入了。

with 語句用於設置代碼在特定對象中的作用域。

它的語法:
with (expression) statement

畢竟,with運行緩慢!知道有這麼個東西就好。

舉個例子

var  obj={a:"11",b:"22"}
with(obj){
   console.log(a,b)
}

with能夠擴充obj對象的作用域,我們可以直接書寫obj中對象a,b;如果不是因爲運行緩慢這一個巨大缺欠,到也方便。換成我們普通寫法,那就得obj.a ,obj.b  有點麻煩。既然是擴展作用域,那麼我們也可以乾點別的。

var  obj ={
    a:40,
    fn:function(){
        with(this){
        var a=100;
        console.log(a);
       }
   }
}
obj.fn();
console.log(obj.a);
簡單說明下,對象中有函數,with中的this代表是obj對象,所以with擴展了obj作用域,那麼fn中的變量a就會由原來的fn內部提升變爲obj對象提升,所以第一個打印a結果是100,而外部打印的obj.a結果也明顯了,由於with影響,fn內部a=100修改了obj.a的值,所以也是100

由於這部分功能,某些js插件庫依舊使用with簡化書寫,但是大家也看出來,with弊端明顯,不僅慢,而且很多時候不利於代碼維護和閱讀。就好比上面作用域擴充,直接就導致變量a被覆蓋。如果是大量代碼,維護起來難,閱讀代碼都費勁。

由於閱讀難,那麼個人使用with也容易造成潛在bug,因爲代碼作用域擴充,稍不注意,跳開函數作用域,各種全局變量,就很頭疼。

最後,對於js引擎解析with時候,查找相關屬性先後順序,不深入了,具體的大家可以看下參考鏈接以及百度谷歌。


參考鏈接:http://www.jb51.net/article/79474.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章