2

thisキーワードの仕組みを理解しようとしています。

この記事このキーワードの状態

「JavaScript では、これは常に、実行している関数の「所有者」、または関数がメソッドであるオブジェクトを指します。」

function someClosure() {
    var myVal0, myVal1, myVal2;

    init = function (myVal0, myVal1, myVal2) {

        myVal0 = myVal0;
        this.myVal1 = myVal1;
        this.myVal2 = myVal2;

    };

    getMyVal0 = function() { return myVal0 };
    getMyVal1 = function() { return myVal1 }
    getMyVal2 = function() { return this.myVal2 }
};

名前の衝突のために呼び出された後だgetMyVal0と思います(割り当てがあいまいです)。undefinedinit()

しかし、( を呼び出した後) が返されるinit()のはなぜですか? への参照があいまいであってはなりません。Javascript では明示的に を使用する必要がありますか? 期待値を返しますが、明示的な.getMyVal1undefinedmyVal1thisgetMyVal2this

この動作を明確にしてください。

最終的には、メンバー変数を初期化するときに関数の引数の命名規則を確立しようとしています。業界の慣例では、IRR は IRR であり、変数に 2 つの名前を付けるのを避けることができるように思わthisれます (メンバー変数を常に で参照するthis必要はありません)。

4

3 に答える 3

3

varECMAscript 2-6-2 第 3 版と ES5のキーワードは、「現在のコンテキストでその変数を宣言する」と言うだけです。this反対側では、常に「呼び出しのオブジェクト」(私はそれをどのように呼びたいか)を指しますが、これは別の話です.

for a 関数は、contextJavascript 自体から直接アクセスすることはできず、下層lexicalEnvironment(ES5) またはExecution Context -> Activation Object(ES3) にのみ存在します。

したがって、明示的に呼び出すthis.xxxことで、OOI の読み取りと書き込みが行われます (メソッドの呼び出し方法に基づいて変更される可能性があります)"Activation Object"ホールド_

  • 仮パラメータ
  • によって宣言された変数var
  • 関数宣言

これらすべてがによって参照されるオブジェクトに格納されているわけthisではありません。

于 2012-08-02T15:13:12.550 に答える
3

その記事では、PPKは単に間違っています。ポインタには、関数呼び出しごとthisに新たに決定される値があります。JavaScript には「メソッドの所有権」というものはありません。オブジェクト プロパティ参照の結果としてメソッドが呼び出されると、ポインタは値を取得しますが、これは事実ですが、同じメソッドが多くの異なるオブジェクトのプロパティになる可能性があります。this

それとは別に、コンストラクター関数のローカル変数は、オブジェクトが参照するオブジェクト プロパティとは完全に異なることを理解することが重要thisです。あれは、

function Constructor() {
  var x, y;

  x = "whatever";
}

そのコードでは、変数 "x" と "y" はローカル変数であり、オブジェクトのプロパティではありません。

于 2012-08-02T15:11:41.540 に答える
2

MDNのキーワードの紹介をthis読んでください。

の値はthis、関数の呼び出し方法によって異なります。しかし、まったく呼び出さずinit、すべての変数はまだundefined.

業界の慣習によりthis、変数に 2 つの名前を付けないようにする必要があります。

JavaScript のNo.は、 Java などの他の言語thisとは異なります。thisより高いスコープから変数にアクセスすることはできません。あなたの場合、init関数の引数は変数を隠しているだけですmyClosure-それらにアクセスすることはできません。必要に応じて名前を変更する必要があります。次のスクリプトを使用します。

var init, getMyVal; // global, or at least "outer", variables

function closure() {
    var myVal, myVal2; // scoped to the closure

    // all the following function can access them
    init = function(val, myVal2) {
        myVal = val; // assign the argument to the closure variable
        // myVal2 === myVal2 - sorry, this only refers to the argument
    };
    getMyVal = function() {
        return myVal; // get the closure variable
    };
};
closure(); // execute it - you might also have used a immediately-executing function

init("some value");

getMyVal(); // "some value"

ところで、と を 1 つの関数だけに組み合わせてclosure呼び出すこともできます。init

var getMyVal;
function initClosure(myVal) {
    // the argument is scoped to this function, like a var declaration

    getMyVal = function() { return myVal; };
}
initClosure("some value");

getMyVal(); // "some value"
于 2012-08-02T15:12:02.997 に答える