with语句提供任何“便利“,让你的应用变得不可靠和低效率。我们需要对单一对象依次调用一系列方法。使用with语句可以很方便地避免对对象的重复引用:
复制代码 代码如下:
function status(info){
var widget = new Widget();
with(widget){
setBackground("blue");
setForeground("white");
setText("Status : "+info);
show();
}
}
使用with语句从模块对象中”导入“(import)变量也是很有诱惑力的。
复制代码 代码如下:
function f(x,y){
with(Math){
return min(round(x),sqrt(y));//抽象引用
}
}
事实上,javascript对待所有的变量都是相同的。javascript从最内层的作用域开始向外查找变量。with语言对待一个对象犹如该对象代表一个变量作用域,因此,在with代码块的内部,变量查找从搜索给定的变量名的属性开始。如果在这个对象中没有找到该属性,则继续在外部作用域中搜索。with块中的每个外部变量的引用都隐式地假设在with对象(以及它的任何原型对象)中没有同名的属性。而在程序的其他地方创建或修改with对象或其原型对象不一定会遵循这样的假设。javascript引擎当然不会读取局部代码来获取你使用了那些局部变量。javascript作用域可被表示为高效的内部数据结构,变量查找会非常快速。但是由于with代码块需要搜索对象的原型链来查找with代码里的所有变量,因此,其运行速度远远低于一般的代码块。
替代with语言,简单的做法,是将对象绑定在一个简短的变量名上。
复制代码 代码如下:
function status(info){
var w = new Widget();
w.setBackground("blue");
w.setForeground("white");
w.setText("Status : "+info);
w.show();
}
其他情况下,最好的方法是将局部变量显式地绑定到相关的属性上。
复制代码 代码如下:
function f(x,y){
var min = Math.min,
round = Math.round,
sqrt = Math.sqrt;
return min(round(x),sqrt(y));
}
1.3熟练掌握闭包
理解闭包有单个概念:
a)javascript允许你引用在当前函数以外定义的变量。
复制代码 代码如下:
function makeSandwich(){
var magicIngredient = "peanut butter";
function make(filling){
return magicIngredient + " and " + filling;
}
return make("jelly");
}
makeSandwich();// "peanut butter and jelly"
b)即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量
复制代码 代码如下:
function makeSandwich(){
var magicIngredient = "peanut butter";
function make(filling){
return magicIngredient + " and " + filling;
}
return make;
}
var f = sandwichMaker();
f("jelly"); // "peanut butter and jelly"
f("bananas"); // "peanut butter and bananas"
f("mallows"); // "peanut butter and mallows"