任何人都可以向我解释为什么“b”返回undefined以及我如何解决这个问题?当我通过引用调用原型函数时,为什么“this”范围会丢失?
MyClass = function(test) {
this.test = test;
}
MyClass.prototype.myfunc = function() {
return this.test;
}
var a = new MyClass('asd').myfunc();
var b = new MyClass('asd').myfunc;
// Returns "asd" correctly
console.log(a)
// Returns undefined??
console.log(b())
===编辑/解决方案===
正如plalx所写,在我的情况下,正确的解决方案是使用.bind()。所以结果如下:
MyClass = function(test) {
this.test = test;
}
MyClass.prototype.myfunc = function() {
return this.test;
}
var a = new MyClass('asd').myfunc();
var b = new MyClass('asd'),
bfunc = b.myfunc.bind(b)
// Returns "asd" correctly
console.log(a)
// Also returns "asd" correctly!
console.log(bfunc())
答案 0 :(得分:6)
如果您想要这种行为,则需要明确地绑定此值。
var c = new MyClass('asd'),
b = c.myfunc.bind(c);
console.log(b());
默认情况下,this
会指向调用中的leftSide.ofTheDot();
,或者只是调用该函数的对象。
注意:致电b();
与window.b();
相同。
将每个函数绑定到对象实例是可能的,但效率很低,因为函数不再在实例之间共享。
E.g。
function MyClass(someVal) {
var me = this;
me.someVal = someVal;
me.someFn = function () {
return me.someVal;
};
}
答案 1 :(得分:-1)
第var b..
行。是一个函数引用,你实际上并没有调用函数。
答案 2 :(得分:-1)
在这里,您要为变量分配myfunc()函数的结果。
var a = new MyClass('asd').myfunc();
在这里,你是指向b变量函数引用,而不是运行它,并将结果赋值给变量。
var b = new MyClass('asd').myfunc;
最后在这里:
console.log(b())
您尝试记录功能b 的结果,在这种情况下,b()未在任何地方定义,只为其分配了对函数的引用。
试试这个:
console.log(b); // It logs [Function]
但除此之外,你的问题很难理解。
P.S。用分号!