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

この動作が必要な場合は、この値を明示的にバインドする必要があります。

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

ラインvar b..。は関数参照であり、実際には関数を呼び出していません。

于 2013-10-18T19:09:07.473 に答える