2012-03-12 10 views
1

以下はJSバインディング用のES5シムです。わかりません自己 .applyバインド関数にあります。 私はapplyメソッドの使い方を知っていますが、ここではの自己が指していますか?それは
の機能と思われますが、ここで自己はオブジェクトのように見えます。バインディング関数用のES5シムはJavaScriptです

if (!Function.prototype.bind) { 

     Function.prototype.bind = function(obj) { 

     var slice = [].slice, 
     args = slice.call(arguments, 1), 
     self = this, 

     nop = function() {}, 

     bound = function() { 
     return self.apply(this instanceof nop ? this : (obj || {}), // self in this line is supposed 
     to // represent a function ? 
     args.concat(slice.call(arguments))); 
     }; 

     nop.prototype = self.prototype; 
     bound.prototype = new nop(); 
     return bound; 
     }; 
    } 
+0

私は、これはこの時点で、古代の質問です知っているが、それは、Googleの検索アナリティクスではかなり高いアップしています。受け入れられた答えはかなり誤解を招く。私はいくつかの追加の詳細と新しい答えを掲載しました。あなたが興味を持っているかどうか見てください。 – bigtunacan

答えて

-1

はjavascriptののほぼすべてが対象であることを念頭に置いてもらいます。

だから、あなたがすぐそこにそれを持っている:

自己=この

をので、自己が自己インスタンスである、何を表すではありません。

2

selfは、thisが範囲の変更とともに変更されるという事実に対応するためにリストしたシムで使用されています。 Function.prototype.bind関数の直接の範囲内でthisは、バインド関数が呼び出されたオブジェクトを参照します。

ネストしたboundファンクションを入力すると、thisが変更されました。著者はbind関数内にself = thisを割り当てて、bindが呼び出されたときにthisという値を、語彙スコープ(クロージャ)を介してbound関数の利用可能なままにできるようにしました。

JavaScript内のスコープはかなり複雑になる可能性があります。詳細な説明はこの記事をご覧ください。

Everything you wanted to know about JavaScript scope.

+0

こんにちはbigtunacan。 その間、私はJSについて、その機能的性質、オブジェクト指向スタイル、およびスコープとクロージャーを学びました。この例から、私はプロトタイプオブジェクトがオブジェクトである関数によって継承されることを理解していなかったことを思い出すことができます。 しかし、とにかくあなたの答えに感謝します。 – carousel

関連する問題