3

このパターンがよく見られます

  (function(){}).call(this)

これも同じですか?

  (function(that){})(this)

前もって感謝します

編集

これらの2つのコードは同じ問題を解決しようとしていますか?これの文脈?

編集

誰かがタイトルを編集して、より良いものを提供できますか?それは面白いと思います。

4

3 に答える 3

2

いいえ、そうではありません。もう1つは関数にオブジェクトコンテキストを与え、もう1つはオブジェクトコンテキストなしで引数を渡します。

次のようなジェネリック関数を想像してみてくださいArray#shift()

var shift = Array.prototype.shift;

//Shift expects an object context, and cannot be called without one.


//so this won't work:
shift($("div"))
//undefined

//This does:
shift.call($("div"))
//<div id=​"notify-container">​&lt;/div>​
于 2012-08-08T12:40:35.903 に答える
1

これらの2つのコードは同じ問題を解決しようとしていますか?これの文脈?

はい、しかし別の方法で。

最初のバージョンは、これを最初の引数として呼び出し、呼び出された関数コンテキスト内の変数が参照するコンテキストFunction.prototype.callオブジェクトを受け入れます。this

2番目のバージョンは、無名関数を自己呼び出しし、this(呼び出しコンテキストで)参照するオブジェクトを無名関数に渡します。これで、呼び出された無名関数コンテキスト内で、を介してアクセスできますthatまたはthisになります(ES5ストリクトモードによって異なります)globalundefined

于 2012-08-08T12:47:05.710 に答える
1

質問の後に編集

いいえ。Function.prototype.callthisは最初の引数として受け入れます。thisこの場合、実際の引数として関数に渡されることはありません。ただし、 2番目の関数のように、実際に渡さthisれたものに対処できます。that

編集:ここに例があります。

MyObject = {};
MyObject.prototype.myMethod = function(value) { console.log("Hello, " + value); }
var obj = new MyObject();

function myMethodCaller(value)
{
    this.myMethod(value);
}

myMethodCaller("World!");
myMethodCaller.call(obj, "World!");
  • [暗黙的に] this(レシーバー)はほとんどの場合(より一般的には、コンテキスト内にあるものは何でも、グローバルオブジェクトです。ワーカーなどとは異なります)、メソッドwindowを持たないため、最初の呼び出しはエラーで失敗します。myMethod
  • 2番目の呼び出しでは、「Hello、World!」がログに記録されます。thisがを指しているので、コンソールに入力します。objこの上でmyMethodメソッドが呼び出されます。
于 2012-08-08T12:40:46.497 に答える