for循环中的JavaScript匿名函数错误
您好,我正在阅读第6版的“JavaScript:权威指南”,并在9.1类和原型中尝试了其中一个示例for循环中的JavaScript匿名函数错误,javascript,function,object,prototype,Javascript,Function,Object,Prototype,您好,我正在阅读第6版的“JavaScript:权威指南”,并在9.1类和原型中尝试了其中一个示例 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 <=
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 + ")";
}
};
您知道如何修复此错误吗?Log不能在console对象之外调用,您要传递的是函数,而不是上下文
r.foreach(function(a){
console.log(a);
});
这可以正常工作。发生这种情况是因为您将
log
方法从console
对象中分离,而console.log
希望上下文(This
)是console
,而不是当您丢失上下文时的窗口
。如果您想使用console.log
作为函数,您应该明确告诉它要使用什么上下文
r.foreach(console.log.bind(console));
在这种情况下他是你的朋友
对于未来的读者:ES6样式还允许您为此使用箭头函数,这将更加简洁:
r.foreach(x => console.log(x))
我认为这是console.log中的一些东西,很好,它可以工作,但是为什么呢?事实上,它是通过对象控制台调用的,对吗?@DontVoteMeDown当你传递一个函数时,你传递的是函数,而不是父信息,在你的循环中调用函数,然后遇到一个问题,
这个
对象是窗口而不是控制台,函数会生成一个错误。@techfoobar很快就会有另一种经典的方法来执行它r.foreach(x=>console.log(x))
:)Hmm。。我需要保持最新的规格。谢谢。:)谢谢你的解释,现在有道理了
r.foreach(x => console.log(x))