当通过引用调用原型函数时,类失去“this”范围

时间:2013-10-18 19:07:32

标签: javascript function reference scope prototype

任何人都可以向我解释为什么“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())

3 个答案:

答案 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。用分号!