扩展阵列和闭包

时间:2014-01-23 18:05:01

标签: javascript methods closures prototype

我正在阅读一本很棒的javascript书,John Resig和Bear Bibeault的Javascript Ninja的秘密。我得到了他们正在展示“扩展”Array类的可能方法的部分。 (因为它们并没有真正扩展它)这是示例中的代码:

function MyArray() {}
MyArray.prototype.length = 0;

(function() {
    var methods = ['push', 'pop', 'shift', 'unshift', 'slice', 'splice', 'join'];
    for (var i = 0; i < methods.length; i++) (function(name) {
        MyArray.prototype[ name ] = function() {
            return Array.prototype[ name ].apply(this, arguments);
        };
    })(methods[i]); //<-This one
})();
var mine = new MyArray();
mine.push(1, 2, 3);

我离javascript专家很远,有时发现闭包有问题,所以我的问题是:内部立即函数需要什么?如果我这样写:

for (var i = 0; i < methods.length; i++) {
    MyArray.prototype[methods[i]] = function() {
        return Array.prototype[methods[i]].apply(this, arguments);
    };
};

控制台将记录:ReferenceError:对未定义属性方法[i]的引用。这是否意味着MyArray.prototype实际上没有分配方法,直到我调用它上面的一些方法?或者这里的诀窍是什么?非常感谢!

1 个答案:

答案 0 :(得分:1)

循环问题是i变量与循环的所有迭代中捕获的变量相同,因此最终效果是MyArray中的所有原型方法最终都会调用methods[methods.length](因为i最终会得到值methods.length),这是未定义的!

这就是为什么你需要分别捕获每个i,并在循环中创建闭包是一种方式。

查看此jsfiddle的控制台,了解其实际效果。