2

谁能向我解释为什么“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())
4

3 回答 3

6

如果你想要这种行为,你需要明确地绑定 this 值。

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;
    };
}
于 2013-10-18T19:10:29.573 回答
-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]

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

PS 使用分号!

于 2013-10-18T19:52:08.413 回答
-1

var b..。是一个函数引用,您实际上并没有调用该函数。

于 2013-10-18T19:09:07.473 回答