3

私はいつもそれsome_function(...)がとまったく同じだと思っていましsome_function.call(this, ...)た。これは、コンストラクター/オブジェクト構築コンテキストでの呼び出しには当てはまらないようです。

function Class(members, parent) {
    function Ctor(value) {
        members.__init__.call(this, value);
        return this;
    };
    Ctor.prototype = members;
    Ctor.prototype.__proto__ = parent.prototype;
    return Ctor;
}

var Base = Class({
    __init__: function(value) {
        this.value = value;
    }
}, {});

var Child = Class({
    __init__: function(value) {
        // Base(value*2); ← WON'T WORK AS EXPECTED
        Base.call(this, value*2); // works just fine
    }
}, Base);

そのChild.__init__中で、への明示的な呼び出しを使用する必要がありますBase.call(this, value)。この長い表現を使用しない場合は、呼び出されたベースコンストラクターでthisグローバルオブジェクト(windowブラウザー内)に名前を付けます。"use strict"strictモードにはグローバルオブジェクトがないため、エラーが発生します。

Func.call(this, ...)この例で使用する必要がある理由を誰かに説明してもらえますか?

(Node.jsv0.6.12およびOpera12.50でテスト済み。)

4

1 に答える 1

4

で関数を呼び出すことは、で関数を.call呼び出すこととは異なり()ます。最初の引数で呼び出し.callの値を明示的に設定します。this通常の呼び出しでは、厳密モードが有効になっているかどうかに応じて、this値は暗黙的にグローバルオブジェクトまたはになります。undefined

func.call({}, 1); //Call the function func with `this` set to the object and pass 1 as the first argument

func(1); //Call the function func with 1 as the first argument. The value of this inside the function depends on whether strict mode is on or off.

.callを参照してください


some_function(...)はsome_function.call(this、...)とまったく同じだといつも思っていました。これは、コンストラクター/オブジェクト構築コンテキストでの呼び出しには当てはまらないようです。

それは真実ではありません、彼らは決して同じではありません。おそらく、あるオブジェクトのプロパティとして関数を呼び出すことと混同しているでしょう。これは、メソッド呼び出しのの値であり、実質的にはと同じであることobj.method()を意味します。objthisobj.method.call(obj)

于 2012-07-15T21:26:09.080 に答える