北京時間今天淩晨,來自Twitter的前端工程師Angus Crol,在柏林舉辦的JSConf會議上,進行了題為"Break all the Rulez"的演講,主要講了一些我們通常認為是錯誤的不該使用的東西,其實是有用的.本文最下面有演講用的slides.遠在美國的JavaScript之父看了slides也說:我同意其中大部分觀點(看來還是有問題?).
下面我把要點簡單翻譯一下,不做擴充解釋.
with語句
為什麼不去使用它?
1.意外的運行結果,可能隱式建立全域變數
2.閉包範圍解析過多消耗
3.後期編譯
有人說,ES5的strict 模式可以防止隱式建立全域變數(不用var),這樣能減少with的一個問題.但是...
strict 模式也不能使用with啊.
為什麼說它是有用的?
1.構建瀏覽器開發人員工具
- //Chrome Developer Tools
- IS._evaluateOn =
- function(evalFunction, obj, expression) {
- IS._ensureCommandLineAPIInstalled();
- expression =
- "with (window._inspectorCommandLineAPI) {\
- with (window) { " + expression + " } }";
- return evalFunction.call(obj, expression);
- }
2.類比塊級範圍
- //是的,還是這個老掉牙的問題
- var addHandlers = function(nodes) {
- for (var i = 0; i < nodes.length; i++) {
- nodes[i].onclick =
- function(e) {alert(i);}
- }
- };
- //你可以通過在外麵包一個函數來解決
- var addHandlers = function(nodes) {
- for (var i = 0; i < nodes.length; i++) {
- nodes[i].onclick = function(i) {
- return function(e) {alert(i);};
- }(i);
- }
- };
- //或者使用'with'來類比塊級範圍
- var addHandlers = function(nodes) {
- for (var i = 0; i < nodes.length; i++) {
- with ({i:i}) {
- nodes[i].onclick =
- function(e) {alert(i);}
- }
- }
- };