with是ecmascript規定的內容,主要用於設定**在特定物件中的作用域。
var smessage = "hello";
with(smessage)
//等同於
alert(smessage.touppercase())
with
語句可以在不造成效能損失的情況下,減少變數的長度
with(math)
上面**指定math作為預設物件,先在物件內尋找pi、cos、sin函式與屬性,無需math.pi、math.cos()、math.sin()這樣寫,可以減少不必要的指標路徑解析運算,但是可以用臨時變數來達到同樣的效果。
with(o1.o2.o3)
//可以寫成
var temp =o1.o2.o3;
console.log(temp.p1 + temp.p2);
看了幾篇部落格和資料,都不太推薦with語句的使用。
1、先在指定的物件再去其他物件查詢變數會很慢。
第乙個例子裡面,當操作變數r與deg時,首先在math物件裡面找不到,之後會再去其他的物件裡面尋找。在對效能要求比較高的場合,with裡面的語句塊,應該只包含指定物件的屬性和方法,但是這一點很明顯是不太可能滴。
2、容易語義不明,繫結物件不明確,拖慢執行速度。
functionf(x, o)
上面幾行**,如果物件o裡面定義了屬性x,那麼輸出的就是o.x,如果沒有的話也不會報錯,會返回上一級作用域,輸出x的值。
萬一需要取得是o.x,而某個粗心的隊友恰好沒有初始化o.x,那就等著完犢子吧,很難出原因來,因為編譯器根本就不會報錯,這樣使用with不利於**的除錯和模組化,編譯器也無法對這段**進行優化,只能留到執行時判斷,這就拖慢了執行速度。
3、在 ecmascript 5 嚴格模式中該標籤已被禁止。推薦的替代方案是宣告乙個臨時變數來承載你所需要的屬性。
with
語句少數有用場合之一,就是替換模板變數,不過這個我還沒研究明白,等以後有時間再完善。
js學習筆記3 with語句的使用
with是ecmascript規定的內容,主要用於設定 在特定物件中的作用域。var smessage hello with smessage 等同於 alert smessage.touppercase with語句可以在不造成效能損失的情況下,減少變數的長度 with math 上面 指定mat...
js學習筆記3
7.break return continue throw 會終止復合語句 8.switch 詳解p110 6.5 9.break labelname function each alert 結束 i i j j 使用break labelname 不必要包含在乙個迴圈語句或者switch語句 p1...
js學習筆記 026 語句
with object statement 這條語句將 object插入 到作用域鏈頭部,然後執行 statement,最後把作用域鏈恢復到原始狀態。不建議使用,移植性不好,效率低等特點 語句語法 用途break break label case case expression contine co...