定義with語句的目的主要是為了簡化多次編寫相同物件的工作
with語句將object加入到作用域鏈的頭部,然後執行statement,最後把作用域鏈恢復到原始狀態
with(object){ statement; }
作用
# 在物件嵌套層次很深的時候通常會使用with語句來簡化程式碼編寫。而本質上是透過將一個物件的引用當作作用域來處理,將物件的屬性當作作用域中的識別符來處理,從而創建了一個新的詞法作用域
#在客戶端javascript中,可能會使用類似下面這種表達式來存取一個HTML表單中的元素
document.forms[0].address.value
如果這種表達式在程式碼中多次出現,則可以使用with語句將form對象加到作用域鏈的頂層
with(document.forms[0]){ name.value = ''; address.value = ''; emai.value = ''; }
這種方法減少了大量的輸入,不用再為每個屬性名稱添加document.forms[0]前綴。這個物件暫時掛載在作用域鏈上,當javascript需要解析諸如address的標識符時,就會自動在這個物件中尋找
[注意]with語句提供了一種讀取物件的屬性的捷徑,但它並不能建立物件的屬性
如果物件o有一個屬性x,那麼下面程式碼給這個屬性賦值為1
var o = {x:0}; with(o) x = 1; console.log(o.x);//1
如果o中沒有定義屬性x,下面程式碼和不使用with語句的程式碼x=1是一模一樣的。這是因為對變數x進行了LHS查詢,並將1賦值給它
var o = {}; with(o) x = 1; console.log(o.x);//undefined console.log(x);//1
副作用
與eval類似,with語句的javascript程式碼非常難於最佳化,同時也會造成偵錯程式碼困難,且同沒有使用with語句的程式碼相比,它運算得更慢
而且,如果with語句不當,還有可能造成變數洩漏,污染全局作用域的情況
var x = 1; var o = {}; with(o){ x = 2; } console.log(x);//2 console.log(o.x);//undefined
嚴格模式
嚴格模式下,禁止使用with語句
//SyntaxError: Strict mode code may not include a with statement 'use strict'; var o = {}; with(o){ x = 2; }
以上是JavaScript中with語句作用與副作用實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!