diff --git a/chapters/JavaScript_Core/JavaScript_Basics/Function.md b/chapters/JavaScript_Core/JavaScript_Basics/Function.md index 4d875e9..a0e9e9f 100644 --- a/chapters/JavaScript_Core/JavaScript_Basics/Function.md +++ b/chapters/JavaScript_Core/JavaScript_Basics/Function.md @@ -197,7 +197,7 @@ JavaScript函数对象的内部状态不仅包含着函数的代码逻辑,还 for (i = 0; i < nodes.length; i += 1) { nodes[i].onclick = function (i) { return function(e){ - alert(e); + alert(i); //should not be alert(e); }; }(i); } @@ -206,6 +206,23 @@ JavaScript函数对象的内部状态不仅包含着函数的代码逻辑,还 这里使用一个立即执行函数并传递当前的i的值,返回一个新生成的函数。在这个新生成的函数的闭包中就保存了当前的i的值。 +除了这样,还能将其完善得更优雅一些么?当然!我们还可以先在循环之外创建一个辅助函数,让这个辅助函数再返回一个绑定了当前i值的函数,这样则可以避免在循环中创建函数而带来无谓的计算&混淆。 + + + var add_the_handlers = function (nodes) { + var i; + var helper = function (j) { + return function (e) { + alert(j); + }; + }; + for (i = 0; i < nodes.length; i += 1) { + nodes[i].onclick = helper(i); + } + }; + + + ## 函数中的this对象 在一个对象中的this始终引用当前对象,但是在函数中,特别是在闭包中,this有一些特殊的行为。