类在通过引用调用原型函数时"this"失去作用域



谁能向我解释为什么"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]

但除此之外,你的问题很难理解。

附言使用分号!

最新更新