It *_*oom 3 javascript prototype function object
您好我正在阅读"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 + ")";
}
};
Run Code Online (Sandbox Code Playgroud)
将其加载到控制台会引发错误
未捕获的TypeError:非法调用class.js:31.range.methods.foreach class.js:31(匿名函数)
我想foreach方法的意图是将函数名称作为参数传递
var r = range(1, 3);
r.foreach(console.log);
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决此错误?
之所以发生这种情况,是因为您log从console对象中分离了方法,而console.log期望context(this),而console不是Window在丢失上下文时.如果要将其console.log用作函数,则应明确告诉它要使用的上下文.
r.foreach(console.log.bind(console));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Function.prototype.bind是你的朋友.
对于未来的读者:ES6风格也允许您使用箭头功能,这将更简洁:
r.foreach(x => console.log(x))
Run Code Online (Sandbox Code Playgroud)