for循环错误中的JavaScript匿名函数

时间:2014-07-29 12:19:29

标签: javascript function object prototype

您好我正在阅读" JavaScript:权威指南"第6版并尝试了9.1 Classes和Prototypes中的一个示例。

function range (from, to) {
    var r = Object.create(range.methods);

    r.from = from;
    r.to = to;
    return r;
}

range.methods = {
    includes: function(x) { 
        return this.from <= x && x <= this.to; 
    },
    foreach: function(f) {
        for(var x = Math.ceil(this.from); x <= this.to; x++) 
            f(x);
    },
    toString: function() { 
        return "(" + this.from + "..." + this.to + ")"; 
    }
};

将其加载到控制台会引发错误

  

未捕获的TypeError:非法调用class.js:31。   range.methods.foreach class.js:31   (匿名函数)

我想foreach方法的意图是将函数名称作为参数传递

var r = range(1, 3);
r.foreach(console.log);

如何修复此错误?

2 个答案:

答案 0 :(得分:9)

之所以发生这种情况,是因为您从log对象中分离了console方法,而console.log期望上下文(this)为console,而不是Window当你失去上下文时就会变成它。如果您想将console.log用作函数,则应明确告诉它使用哪种上下文。

r.foreach(console.log.bind(console));
在这种情况下,

Function.prototype.bind是你的朋友。

对于未来的读者:ES6风格还允许您使用箭头功能,这将更加简洁:

r.foreach(x => console.log(x))

答案 1 :(得分:4)

无法在控制台对象之外调用日志,而是传入函数,而不是上下文。

r.foreach(function(a){
    console.log(a);
});

这没有任何问题。