0

私は JavaScript のスキルを磨こうとしていますが、関数を呼び出すには 4 つの基本的な方法があることを認識していますthis。私が興味を持っているのは、基本的な2つです。

  • 関数としての呼び出し
  • メソッドとしての呼び出し

それは結構です。1 つ目は、オブジェクトthisを参照します。window

function doSomething() {
    console.log(this);
}

doSomething(); // window is logged

2 つ目thisは、内部から実行されているオブジェクトを参照します。

var t = {
    doSomething: function () {
        console.log(this);
    }
};

t.doSomething(); // t is logged

それはすべて問題ありません。しかし、これら 2 つの呼び出しメソッドでthisは、メソッドが含まれているオブジェクトを常に返すというのは正しいでしょうか (それが理にかなっている場合)。

最初の例でdoSomething()は、 は実際にはオブジェクト内で定義されています。オブジェクトを定義 (または参照) しなくてもwindow、オブジェクトのプロパティです。window

したがって、実際には、関数としての呼び出しはメソッドとしての呼び出しであるとは言えませんか? か否か?

4

1 に答える 1

0

あなたがしたようにグローバルオブジェクトのスコープではなく、別の関数のスコープで関数を定義することを想像してください:

function outer() {
    var inner = function(){console.log(this)};
    inner();
};
outer();

thisは何にバインドされると思いますか? 何が印刷されますか?

あなたはそれが外部関数オブジェクトになると信じているかもしれませんが、それは常にグローバル オブジェクトであることが判明しています。

それはあなたが書いたかのようです:

function outer() {
    var inner = function(){console.log(this)};
    inner.call(window);
};
outer();

これは非常に危険であり、直感的な JS の「機能」とはかけ離れています。

したがって、最初の例に戻ると、基本的には次のようになります。

doSomething = function () {
    console.log(this);
}
doSomething().call(window);

そして、Yoshi が指摘したように、ES5 の strict モードを使用していた場合、代わりにそのようなことを行うことになります。

doSomething().call(未定義);

また、これを関数で使用してはならないという事実についての強いヒントも与えてくれます;)

于 2014-03-04T14:35:17.553 に答える