javascript - 修改 Array.forEach 以自动将上下文设置为调用方

标签 javascript arrays closures iteration

是否可以创建 Array.forEach 的替代方案,自动将上下文“this”设置为与调用该方法时相同的上下文?

例如(不工作,不知道为什么):

Array.prototype.each = function(fn) {
    return this.forEach(fn, arguments.callee.caller);
}


function myFunction() {
    this.myVar = 'myVar';

    [1,2,3].each(function() {
        console.log(this.myVar); // logs 'myVar'
    });
}

最佳答案

Array.forEach 已经将上下文参数作为可选的最后一个参数,

(function() {
    this.myvar = "myvar";

    [1,2,3,4].forEach(function(v) {
        console.log("v:"+v);
        console.log("myvar="+this.myvar);
    }, this);
})();

参见 MDN forEach

此外,上面的示例(如果我们不处理与 this 相关的实例方法)无需使用 bindforEach 的可选上下文参数,以下内容也可以正常工作:

function myFunction() {
    this.myVar = 'myVar';

    [1,2,3].forEach(function() {
        console.log(this.myVar); // logs 'myVar'
    });
}
myFunction();

因为 javascript 在功能范围内,所以匿名函数可以使用 this 访问父函数的范围并且它正确记录。 this 只有在处理实例方法时作为上下文才会真正成为问题。

关于javascript - 修改 Array.forEach 以自动将上下文设置为调用方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24051776/

相关文章:

javascript - socket.io 在 x 秒/第一次尝试获取响应失败后停止重新发出事件

javascript - 如何在没有浏览器嗅探的情况下支持 transitionend?

c - 将输入存储到 malloc 数组(1d 和 2d)并打印

PHP - 循环和lastInsertId()

javascript - React-router(v4)否定双正斜杠

c - OpenACC:如何从指向主机上相应数组的指针选择设备上的数组

grails - 如何在Groovy中查找具有特定属性值的节点的文本?

c# - foreach 和 list.ForEach() 之间的闭包有何不同?

ios - 有什么方法可以持久化 Swift 闭包吗?

javascript - 如何手动调用Backbone.js View 的方法