javascriptの「this」を深く理解する


今までjsの中のthisに対して、理解が足りなくて、同じくいつもいじられて頭がくらくらして転向して、最近《js**》のこの本の中で、thisに関しての説明を見て、とても道理があると感じて、次にみんなに分かち合います.
 
JavaScriptは弱いタイプの言語で、他の言語とは全く違ったセットがあります. this の処理メカニズムを説明します
五種類ぐらいの違いで、this 指し示すものはそれぞれ違っています.いろいろな事情について説明します.
全体の範囲内
this;
全体の範囲で使用する場合 thisは、全体のオブジェクトを指します.
ブラウザで実行されているJavaScriptスクリプトは、このグローバルオブジェクトは window
 
関数の呼び出し
foo();
ここです this 全体のオブジェクトを指します.
厳密なモードでは、グローバル変数は存在しません.この場合 this そうです undefined
 
メソッドの呼び出し
test.foo();
この例では、this 方向を指す test オブジェクト
 
コンストラクタを呼び出す
new foo();
関数が和に傾いている場合 new キーワードを一緒に使うと、この関数は 構造関数関数の内部で、this 新しく作成したオブジェクトを指します.
 
明示的な設定 this
 function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]);//        ,    
foo.call(bar, 1, 2, 3); //   foo    :a = 1, b = 2, c = 3
使用する Funtion.prototype 上の コール または appy メソッドの場合、関数内の thisは 関数呼び出しの最初のパラメータとして明示的に設定します.
したがって、関数呼び出しのルールは上記の例では適用されなくなりました. 関数内 this barに設定されました.
 
よくある誤解
ほとんどの場合は過去のことを言いますが、最初のルールです. 全体の対象に向けて)JavaScript言語の別の間違った設計のところと考えられています.これは実際の用途がないからです.
Foo.method = function() {
    function test() {
        // this           (   :          window   )
    }
    test();
}
よくある誤解は test 的に命中する this 指しています Foo 相手は、実はそうではありません.
 
にあるために test でペアを取得します Foo オブジェクトの参照は、 method 関数の内部にローカル変数の指向性を作成します. Foo オブジェクト
Foo.method = function() {
    var that = this;
    function test() {
        //    that     Foo   
    }
    test();
}
that 私たちが勝手につけた名前ですが、この名前は外部に向けて広く使われています. thisオブジェクトはい、 包みを閉じる 一節を見ることができます. that パラメータとして渡すことができます.
 
メソッドの割り当て式
もう一つの不思議なところは関数の別名、つまり一つの方法を変数に割り当てます.
var test =someObject.methodTest;
test();
上の例では、test 普通の関数が呼び出されるように.したがって、関数内の this もう届かない some Object オブジェクト
とはいえ this の遅いバインディング特性は友好的ではないようですが、これは確実に原型に基づいて生きていく土壌を継承しています.
function Foo() {}
Foo.prototype.method =function() {};
 
function Bar() {}
Bar.prototype =Foo.prototype;
 
new Bar().method();
質に入れる method 呼び出し時、this 指しています Bar のインスタンスオブジェクトを指定します
 
注意:
 対象の文面ステートメント文法において、this オブジェクト自体を指してはいけません.したがって var obj={me:this} 的に命中する 私 objは指しません. this 上記の5つの場合にのみ発生します. この例では、ブラウザで実行するなら、Obj.me windowに等しい オブジェクト
 
ブログを参照してください:
http://www.jb51.net/onlineread/JavaScript-Garden-CN/