Effective JavaScript Item 10 避免使用with
2014-09-04 17:06
417 查看
本系列作为Effective JavaScript的读书笔记。
Item 9:避免使用with关键字
重点:
设计with关键字本来是为了让代码变简洁,但是却起到了相反的效果,比如:
以上的代码中,调用的min,round以及sqrt都是Math上的方法。
如果Math对象上没有以上指定的方法,那么会在with以外的范围去寻找该方法。
那么如果Math对象上有两个字段分别是x和y:
可以发现,最后的调用结果是0。
编译器也无法对代码做出优化,会降低对property的查找速度
一个with的替代方案是给变量尽可能短的名字,然后还是使用常规地方式进行操作,比如:
总结:
避免使用with关键字
对于频繁使用的对象,使用尽可能简短的变量名
显式地绑定object上的property到local
variable,而不是使用with
Item 9:避免使用with关键字
重点:
设计with关键字本来是为了让代码变简洁,但是却起到了相反的效果,比如:
function f(x, y) { with (Math) { return min(round(x), sqrt(y)); // ambiguous references } }
以上的代码中,调用的min,round以及sqrt都是Math上的方法。
如果Math对象上没有以上指定的方法,那么会在with以外的范围去寻找该方法。
那么如果Math对象上有两个字段分别是x和y:
Math.x = 0; Math.y = 0; f(2, 9); // 0
可以发现,最后的调用结果是0。
编译器也无法对代码做出优化,会降低对property的查找速度
一个with的替代方案是给变量尽可能短的名字,然后还是使用常规地方式进行操作,比如:
function f(x, y) { var min = Math.min, round = Math.round, sqrt = Math.sqrt; return min(round(x), sqrt(y)); }
总结:
避免使用with关键字
对于频繁使用的对象,使用尽可能简短的变量名
显式地绑定object上的property到local
variable,而不是使用with
相关文章推荐
- [Effective JavaScript 笔记] 第10条:避免使用with
- Effective JavaScript Item 29 避免使用非规范的Stack Inspection属性
- Effective JavaScript Item 20 使用call方法来绑定this变量
- Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
- Effective JavaScript Item 40 避免继承标准类型
- [Effective JavaScript 笔记]第42条:避免使用轻率的猴子补丁
- Effective JavaScript Item 21 使用apply方法调用函数以传入可变参数列表
- Effective JavaScript Item 50 优先使用遍历方法而非循环
- Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表
- Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__
- Effective JavaScript Item 24 使用一个变量来保存arguments的引用
- Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__
- Effective JavaScript Item 49 对于数组遍历,优先使用for循环,而不是for..in循环
- [Effective JavaScript 笔记]第16条:避免使用eval创建局部变量
- Effective JavaScript Item 46 优先使用数组而不是Object类型来表示有顺序的集合
- Effective JavaScript Item 25 使用bind方法来得到一个固定了this指向的方法
- Effective JavaScript Item 27 使用闭包而不是字符串来封装代码
- [Effective JavaScript 笔记]第45条:使用hasOwnProperty方法以避免原型污染
- [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性