JavaScript 有個 with 關鍵字, with 語句的原本用意是為逐級的對象訪問提供命名空間式的速寫方式。也就是在指定的代碼區域, 直接通過節點名稱調用對象。
我們已經知道,用變量的作用域和作用域鏈(即一個按順序檢索的對象列表)來進行變量名解析,而with 語句就是用於暫修改作用域鏈的,其語法為:
with(object)
statement
該語句可以有效地將object添加到作用域鏈的頭部,然后執行statement,再把作用域鏈恢復到原始狀態。
例如:
1 with(frames[1].document.forms[0]){ 2 //此處直接訪問表單元素。例如: 3 name.value = ‘小小子’; 4 address.value = ‘http://www.xiaoxiaozi.com/’; 5 email.value =’yufulong@gmail.com’; 6 }
表單屬性名前的前綴——frames[1].document.forms[0] 就不用重復寫。
這個對象不過是作用域鏈的一個臨時部分,當JavaScript需要解析像 address這樣的標識符時就會自動搜索它。
但是with語句有個很大的缺陷:
使用with語句的JavaScript代碼很難優化,因此它的運算速度比不使用with語句的等價代碼要慢得多。
而且,在with語句中的函數定義和變量初始化可能會產生令人驚訝的、相抵觸的行為。(雖然作者沒有舉例,不過這話可夠嚇人的)。
因此我們避免使用with語句。
所以應該避免使用with語句。
而對於with語句實現的語句簡化,我們完全可以使用變量來實現。
例如:
1 var form = frames[1].document.forms[0]; 2 form.name.value = ‘小小子’; 3 form.address.value = ‘http://www.xiaoxiaozi.com/’; 4 form.email.value = ‘yufulong@gmail.com’;
