js with關鍵詞
with關鍵字的作用在於改變作用域,with會影響性能,不推薦使用
在js高級程序設計中,with是這樣描述的,with語句的作用就是將代碼的作用域設置到一個特定的作用域中
使用with關鍵字的目的是為了簡化多次編寫訪問同一個對象上的工作,比如下面的這個例子:
var qs = location.search.substring(1)
var hostname = location.hostname
var url = location.href;
使用with簡化了上面的寫法:
with(location){
var qs = search.substring(1);
var hostname = hostname;
var url = location.href;
}
在上面的這段代碼中,with關聯了location,在with代碼塊中,每個變量被認為是一個局部的變量,如果局部變量與location對象的某個屬性同名,則這個變量會指向location的對象的屬性
function sayHello(){
function haha(){
var word = "hellowrold";
}
return word;
}
將上述代碼寫入全局執行環境中,所涉及到三個執行環境的變量對象的作用域鏈,haha()對應的活動對象,sayHello()對應的活動對象,全局執行環境的變量對象,根據js高級程序設計73頁的描述:作用域前端的變量對象可以訪問後端的變量對象的屬性,反之則不行
上述代碼在解析時,出現world未定義,但是,在一下代碼中,
function buildUrl(){
with(location){
var url = href;
}
return url;
}
按照書中所述,with延長了作用域鏈,且是在作用域鏈的buildUrl執行環境對應的變量對象前面添加了變量對象
為什麽在with這個作用域中定義的局部變量,能被包裹它的函數訪問到呢?
因為:
with是個語句,是沒有作用域的,with只是將location的這個對象的屬性跟方法放到了一個變量對象中並將起放在了作用域的前端(原本在作用域前端的是buildUrl的變量對象),這就是延長了作用域,而為何buildUrl可以訪問URL,這是因為js中with沒有作用域,所以URL是在buildUrl的變量對象中,因此可以訪問到。
try-catch也可以延長作用域鏈
try-catch 在使用時的花括號會創建一個局部的作用域,自然就延長了作用域鏈,這個局部的作用域會在語句執行之後自動銷毀
js with關鍵詞