来源:紫云飞的博客,@紫云妃
来自Twitter的前端工程师Angus Croll,在柏林举办的JSConf会议上,进行了题为”Break all the Rulez“的演讲。主要讲了一些我们通常认为是错误的不该使用的东西,其实是有用的。Angus Croll 演讲用的讲稿(链接),远在美国的JavaScript之父看后也说同意其中大部分观点(看来还是有问题?)。
下面我把要点简单翻译一下,不做扩展解释.
with语句
为什么不去使用它?
1.意外的运行结果,可能隐式创建全局变量
2.闭包作用域解析过多消耗
3.后期编译
有人说,ES5的严格模式可以防止隐式创建全局变量(不用var),这样能减少with的一个问题.但是…
严格模式也不能使用with啊.
为什么说它是有用的?
1.构建浏览器开发者工具
1 2 3 4 5 6 7 8 9 |
//Chrome Developer Tools IS._evaluateOn = function(evalFunction, obj, expression) { IS._ensureCommandLineAPIInstalled(); expression = "with (window._inspectorCommandLineAPI) {\ with (window) { " + expression + " } }"; return evalFunction.call(obj, expression); } |
2.模拟块级作用域
1 2 3 4 5 6 7 |
//是的,还是这个老掉牙的问题 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { nodes[i].onclick = function(e) {alert(i);} } }; |
1 2 3 4 5 6 7 8 |
//你可以通过在外面包一个函数来解决 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { nodes[i].onclick = function(i) { return function(e) {alert(i);}; }(i); } }; |
1 2 3 4 5 6 7 8 9 |
//或者使用'with'来模拟块级作用域 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { with ({i:i}) { nodes[i].onclick = function(e) {alert(i);} } } }; |
eval语句
为什么不去使用它?
1.代码注入
2.无法进行闭包优化
3.后期编译
为什么说它是有用的?
1. JSON.parse不可用的时候
有人在Stack Overflow上说:
“JavaScript的eval是不安全的,使用json.org上的JSON解析器来解析JSON”
还有人说:
“不要使用eval来解析JSON!用道格拉斯写的json2.js!”
可是:
1 2 3 4 5 6 7 8 |
// From JSON2.js if (/^[\],:{}\s]*$/ .test(text.replace(/*regEx*/, '@') .replace(/*regEx*/, ']') .replace(/*regEx*/, ''))) { j = eval('(' + text + ')'); } |
2.浏览器的JavaScript控制台都是用eval实现的
在Webkit控制台或JSBin中执行下面的代码
下面我把要点简单翻译一下,不做扩展解释.
with语句
为什么不去使用它?
1.意外的运行结果,可能隐式创建全局变量
2.闭包作用域解析过多消耗
3.后期编译
有人说,ES5的严格模式可以防止隐式创建全局变量(不用var),这样能减少with的一个问题.但是…
严格模式也不能使用with啊.
为什么说它是有用的?
1.构建浏览器开发者工具
1 2 3 4 5 6 7 8 9 |
//Chrome Developer Tools IS._evaluateOn = function(evalFunction, obj, expression) { IS._ensureCommandLineAPIInstalled(); expression = "with (window._inspectorCommandLineAPI) {\ with (window) { " + expression + " } }"; return evalFunction.call(obj, expression); } |
2.模拟块级作用域
1 2 3 4 5 6 7 |
//是的,还是这个老掉牙的问题 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { nodes[i].onclick = function(e) {alert(i);} } }; |
1 2 3 4 5 6 7 8 |
//你可以通过在外面包一个函数来解决 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { nodes[i].onclick = function(i) { return function(e) {alert(i);}; }(i); } }; |
1 2 3 4 5 6 7 8 9 |
//或者使用'with'来模拟块级作用域 var addHandlers = function(nodes) { for (var i = 0; i < nodes.length; i++) { with ({i:i}) { nodes[i].onclick = function(e) {alert(i);} } } }; |
eval语句
为什么不去使用它?
1.代码注入
2.无法进行闭包优化
3.后期编译
为什么说它是有用的?
1. JSON.parse不可用的时候
有人在Stack Overflow上说:
“JavaScript的eval是不安全的,使用json.org上的JSON解析器来解析JSON”
还有人说:
“不要使用eval来解析JSON!用道格拉斯写的json2.js!”
可是:
1 2 3 4 5 6 7 8 |
// From JSON2.js if (/^[\],:{}\s]*$/ .test(text.replace(/*regEx*/, '@') .replace(/*regEx*/, ']') .replace(/*regEx*/, ''))) { j = eval('(' + text + ')'); } |
2.浏览器的JavaScript控制台都是用eval实现的
在Webkit控制台或JSBin中执行下面的代码