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 在使用时的花括号会创建一个局部的作用域,自然就延长了作用域链,这个局部的作用域会在语句执行之后自动销毁