javascript - 扩展数组和闭包

标签 javascript methods closures prototype

我正在读一本很棒的 javascript 书,《Javascript Ninja 的 secret 》,作者是 John Resig 和 Bear Bibeault。我到达了他们展示“扩展”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 实际上没有分配该方法,直到我调用它的某些方法?或者说这里有什么技巧?非常感谢!

最佳答案

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

这就是为什么您需要单独捕获每个 i,并且在循环内创建闭包是一种方法。

查看控制台 jsfiddle看看它的实际效果。

关于javascript - 扩展数组和闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316025/

相关文章:

xcode - 类声明无法关闭外部作用域中定义的值 'fulfill' - Swift 2.0

javascript - 在 JavaScript 中存储和返回 HTML 表单的输入变量

javascript - "true"即使值为假,评估仍在运行

Java 仅从循环内返回值

java - 实现 Getextra() 和 Putextra

swift - 复制 Array.reduce() 方法

javascript - 如何在react redux中存储多层对象?

javascript - 我如何处理 jQuery.Ajax 中的时间响应(数据类型 : JSON)?

c# - 方法名称会被编译到 EXE 中吗?

haskell - 在 Haskell 中模拟状态关闭的正确方法是什么