谁能向我解释为什么"b"返回未定义以及如何解决这个问题?为什么当我通过引用调用原型函数时,"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())
如果需要此行为,则需要显式绑定此值。
var c = new MyClass('asd'),
b = c.myfunc.bind(c);
console.log(b());
默认情况下,this
将指向调用中的leftSide.ofTheDot();
,或者仅指向调用函数的对象。
注意:调用b();
与window.b();
相同。
可以将每个函数绑定到对象实例,但效率低下,因为函数将不再在实例之间共享。
例如
function MyClass(someVal) {
var me = this;
me.someVal = someVal;
me.someFn = function () {
return me.someVal;
};
}
行var b..
. 是一个函数引用,您实际上并没有调用该函数。
在这里,您将 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]
但除此之外,你的问题很难理解。
附言使用分号!