JavaScriptをこれが最後であることは何ですか?

JavaScriptをこれが最後であることは何ですか?

 

これは、我々は非常に面倒になり、それはこれを使用するとなると、JavaScript開発者の開発プロセスに大きな「がん」を混乱され、これは最終的にどのようにJavaScriptでいるのですか?話題を避けることではありませんフロントエンドコーダとして。

クラシックコード

さて、それは説明しようと最後にあるものを見るために、コミュニティ内の開口部のコードの本質の古典的な期間を見てみましょう:

関数foo(){ 
    VARのA = 2。
    this.bar(); 
} 

関数bar(){ 
    にconsole.log(this.a)。
} 

のfoo(); //にReferenceError:aが定義されていません

 

コードのこの部分を読んで、私たちは二つの問題について考えるのを助けることができませんでした

これは、関数自体も(×)を指しますか?

これは関数自体を指している場合、()の呼び出しでthis.barのfoo関数は明らかに間違っている、でも魔法成功しました。これを印刷する場合は、この時点では、グローバルオブジェクトウィンドウを参照していることは明らかです。

これは、(×)を、それをスコープ字句を指しますか?

この時点レキシカルスコープ場合、なぜバー()誤って引用スロー?明らかに、これはレキシカルスコープを指していません。

私はその後、我々はこの時点で考えるようにしているだけでなく、私たちは多くの場合、これらの二つの間違った考えを持っている文にはおそらく、コミュニティの古典的なコードを考えて、そして最後に、これは何ですか?

なぜこれがあるのでしょうか?

JavaScriptがなぜこの説明を使用する前に、我々は以下のコードを見てみましょう:

 
関数のprintName(OBJ){ 
    にconsole.log(obj.name)
} 

VAR OBJ1 = { 
    名: 'obj1Name' 
} 

VAR OBJ2 = { 
    名: 'obj2Name' 
} 

のprintName(OBJ1)。// obj1Name 
のprintName(obj2が)。// obj2Name
 

 

あなたがオブジェクトのname属性を印刷する場合は、このコードでは、その後、あなたはパラメータを渡す必要はありませんので、もし、メソッドのパラメータに渡されたオブジェクトを表示する必要があり、そのような動作を実現する方法はありますか?

今回は、これが生まれました。以下のコードを見てください:

 
関数のprintName(){ 
    にconsole.log(this.name)
} 

VAR OBJ1 = { 
    名: 'obj1Name' 
} 

VAR OBJ2 = { 
    名: 'obj2Name' 
} 

printName.call(OBJ1)。// obj1Name 
printName.call(obj2が)。// obj2Name
 

 

これは、このミッションの出現がで指名手配され、発生した理由です関数呼び出し暗黙のオブジェクト参照の通過時間、我々は我々のコードを見て、よりエレガントにしたいのですが、JavaScriptでこれを導入することは、本当に我々は完璧をやりたいですそれを行うには?

いいえ、私は、フロントエンド開発者の頭痛の大半、および(自己=このまたは矢印機能)を避けるために、レキシカルスコープを使用してのも、コンセプトをできるように、少なくともこの時点まで、しませんでした。

これは、特徴

上記の説明では、我々はこのの機能のいくつかを描くことができます。

図1に示すように、暗黙の転送オブジェクト参照、それはスコープ(バーコードクラシック)を貫通していません

2、ランタイムはこの呼び出しを生成します

図3は、これはレキシカルスコープを指していない関数自体を指していません。

だから、これは終わりでは何ですか?

関数が呼び出されると、実行時にこの結合、および実行コンテキストこの時点で生成された関数の呼び出しなどのコールスタック、パラメータ情報を含む実行コンテキスト、このコースで含みます。これは、実行時バインディングが存在し、このためです。

次に、この結合は、どのようにそれの一種である、またはこれが終わり何のポイントであること?

この点(結合)

私はトリプルのJavaScriptのピットを避けるために、これについてお話しましょう:

図1に示すように、関数はオブジェクトメソッドとして呼び出されたとき、これは、(上述の呼び出しコードを呼び出す)オブジェクトの関数を指します。

図2に示すように、関数呼び出しが正常である(グローバルスコープ)、この点ウィンドウ。(注:不定に厳密モード点)。

図3に示すように、この関数は、(矢印関数または匿名関数を除く)現象を貫通しないであろう

ここでは実際に、同じ概念の範囲と浸透に、第三の点の浸透の機能について話をします。なぜ矢印機能と匿名関数は、このことの外側の層に浸透することができますか?

矢印関数は自身の実行コンテキストをしませんし、このコンテキストはプロパティの実装であるため、これを呼び出した場合、そのため、この矢印または機能はここで、その後、実際には、外層矢印機能はこれを呼び出します。

デフォルトでは、この時点

デフォルトでは一般的に言えば、普通の単純な関数呼び出しを見て、言うには、この時点では、これはグローバルオブジェクトへのデフォルトのポイントです。以下のコードを見てください:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        innerFunc(){機能
            はconsole.log(この); 
        } 
        innerFunc()。
    } 
} 

obj.printThis()。
 

 

このコードでは、我々はコードを実装している、あなたは見つけるでしょう、innerFuncはこののプリントアウト(未定義、strictモードで)グローバルオブジェクトウィンドウであることが判明し、同時に、コードのこの作品は、当社objは時に外側の層の機能関数を呼び出す確認これはobjに指し、この現象を貫通する意味がありません。

明示的な本

だから、明示的にこのオブジェクトは、それを呼び出すことができるようにする方法はありますか?(トップ呼び出し)

以下のコードを見てください:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        VaRの自己=この; 
        機能innerFunc(){ 
            にconsole.log(自己)。
        } 
        innerFunc()。
    } 
} 

obj.printThis()。
 

 

コードのこの作品は、これはデフォルトのコードの修理・ポイントである疑いがある(自己を避けることによって、この点を変更しないでください、この内側はまだグローバルオブジェクトを指して)

何の矢印関数実行コンテキストが存在しないため、これは、この外部関数の内部と等価であること、機能矢印、および自己同様の方法を回避することができます。

それは自分のアプリケーション、および矢印の機能を回避することであるのであれば、我々はこの問題と同等のものを脇に置くこれまでのために、我々はまだいくつかの頭痛を感じた場合、私たちは慣れていないレキシカルスコープのものを使用しないことです。

さて、今回は、私たちは、明示的にこれを実行する必要があります。または上記のコードは、次の修飾:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        innerFunc(){機能
            はconsole.log(この); 
        } 
        innerFunc.call(OBJ)。//显式绑定この
    } 
} 

obj.printThis()。
 

 

ここで、我々はこれを明示的にバインド呼び出すので、この時間は、我々はまったく同じ2本をプリントアウトします、オブジェクトobjあります。

呼び出すに加えて、我々は結合して、その効果を達成するために適用することができます。

概要

これは、実行時に生成され、コンテキストに属する関数の特性は、この点に依存して変化し、この点を修正する方法を結合する、適用する、呼び出し明示的に起動することができるを使用して、関数呼び出し状況に応じて決定されます。

これは我々が矢印機能を使用して自己を避ける際に避けられない問題ですが、また、これとレキシカルスコープの概念を混同しないように、この時点を考えます。

これは、我々は非常に面倒になり、それはこれを使用するとなると、JavaScript開発者の開発プロセスに大きな「がん」を混乱され、これは最終的にどのようにJavaScriptでいるのですか?話題を避けることではありませんフロントエンドコーダとして。

クラシックコード

さて、それは説明しようと最後にあるものを見るために、コミュニティ内の開口部のコードの本質の古典的な期間を見てみましょう:

関数foo(){ 
    VARのA = 2。
    this.bar(); 
} 

関数bar(){ 
    にconsole.log(this.a)。
} 

のfoo(); //にReferenceError:aが定義されていません

 

コードのこの部分を読んで、私たちは二つの問題について考えるのを助けることができませんでした

これは、関数自体も(×)を指しますか?

これは関数自体を指している場合、()の呼び出しでthis.barのfoo関数は明らかに間違っている、でも魔法成功しました。これを印刷する場合は、この時点では、グローバルオブジェクトウィンドウを参照していることは明らかです。

これは、(×)を、それをスコープ字句を指しますか?

この時点レキシカルスコープ場合、なぜバー()誤って引用スロー?明らかに、これはレキシカルスコープを指していません。

私はその後、我々はこの時点で考えるようにしているだけでなく、私たちは多くの場合、これらの二つの間違った考えを持っている文にはおそらく、コミュニティの古典的なコードを考えて、そして最後に、これは何ですか?

なぜこれがあるのでしょうか?

JavaScriptがなぜこの説明を使用する前に、我々は以下のコードを見てみましょう:

 
関数のprintName(OBJ){ 
    にconsole.log(obj.name)
} 

VAR OBJ1 = { 
    名: 'obj1Name' 
} 

VAR OBJ2 = { 
    名: 'obj2Name' 
} 

のprintName(OBJ1)。// obj1Name 
のprintName(obj2が)。// obj2Name
 

 

あなたがオブジェクトのname属性を印刷する場合は、このコードでは、その後、あなたはパラメータを渡す必要はありませんので、もし、メソッドのパラメータに渡されたオブジェクトを表示する必要があり、そのような動作を実現する方法はありますか?

今回は、これが生まれました。以下のコードを見てください:

 
関数のprintName(){ 
    にconsole.log(this.name)
} 

VAR OBJ1 = { 
    名: 'obj1Name' 
} 

VAR OBJ2 = { 
    名: 'obj2Name' 
} 

printName.call(OBJ1)。// obj1Name 
printName.call(obj2が)。// obj2Name
 

 

これは、このミッションの出現がで指名手配され、発生した理由です関数呼び出し暗黙のオブジェクト参照の通過時間、我々は我々のコードを見て、よりエレガントにしたいのですが、JavaScriptでこれを導入することは、本当に我々は完璧をやりたいですそれを行うには?

いいえ、私は、フロントエンド開発者の頭痛の大半、および(自己=このまたは矢印機能)を避けるために、レキシカルスコープを使用してのも、コンセプトをできるように、少なくともこの時点まで、しませんでした。

これは、特徴

上記の説明では、我々はこのの機能のいくつかを描くことができます。

図1に示すように、暗黙の転送オブジェクト参照、それはスコープ(バーコードクラシック)を貫通していません

2、ランタイムはこの呼び出しを生成します

図3は、これはレキシカルスコープを指していない関数自体を指していません。

だから、これは終わりでは何ですか?

関数が呼び出されると、実行時にこの結合、および実行コンテキストこの時点で生成された関数の呼び出しなどのコールスタック、パラメータ情報を含む実行コンテキスト、このコースで含みます。これは、実行時バインディングが存在し、このためです。

次に、この結合は、どのようにそれの一種である、またはこれが終わり何のポイントであること?

この点(結合)

私はトリプルのJavaScriptのピットを避けるために、これについてお話しましょう:

図1に示すように、関数はオブジェクトメソッドとして呼び出されたとき、これは、(上述の呼び出しコードを呼び出す)オブジェクトの関数を指します。

図2に示すように、関数呼び出しが正常である(グローバルスコープ)、この点ウィンドウ。(注:不定に厳密モード点)。

図3に示すように、この関数は、(矢印関数または匿名関数を除く)現象を貫通しないであろう

ここでは実際に、同じ概念の範囲と浸透に、第三の点の浸透の機能について話をします。なぜ矢印機能と匿名関数は、このことの外側の層に浸透することができますか?

矢印関数は自身の実行コンテキストをしませんし、このコンテキストはプロパティの実装であるため、これを呼び出した場合、そのため、この矢印または機能はここで、その後、実際には、外層矢印機能はこれを呼び出します。

デフォルトでは、この時点

デフォルトでは一般的に言えば、普通の単純な関数呼び出しを見て、言うには、この時点では、これはグローバルオブジェクトへのデフォルトのポイントです。以下のコードを見てください:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        innerFunc(){機能
            はconsole.log(この); 
        } 
        innerFunc()。
    } 
} 

obj.printThis()。
 

 

このコードでは、我々はコードを実装している、あなたは見つけるでしょう、innerFuncはこののプリントアウト(未定義、strictモードで)グローバルオブジェクトウィンドウであることが判明し、同時に、コードのこの作品は、当社objは時に外側の層の機能関数を呼び出す確認これはobjに指し、この現象を貫通する意味がありません。

明示的な本

だから、明示的にこのオブジェクトは、それを呼び出すことができるようにする方法はありますか?(トップ呼び出し)

以下のコードを見てください:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        VaRの自己=この; 
        機能innerFunc(){ 
            にconsole.log(自己)。
        } 
        innerFunc()。
    } 
} 

obj.printThis()。
 

 

コードのこの作品は、これはデフォルトのコードの修理・ポイントである疑いがある(自己を避けることによって、この点を変更しないでください、この内側はまだグローバルオブジェクトを指して)

何の矢印関数実行コンテキストが存在しないため、これは、この外部関数の内部と等価であること、機能矢印、および自己同様の方法を回避することができます。

それは自分のアプリケーション、および矢印の機能を回避することであるのであれば、我々はこの問題と同等のものを脇に置くこれまでのために、我々はまだいくつかの頭痛を感じた場合、私たちは慣れていないレキシカルスコープのものを使用しないことです。

さて、今回は、私たちは、明示的にこれを実行する必要があります。または上記のコードは、次の修飾:

 
VAR OBJ = { 
    名: 'objNameに'、
    printThis:関数(){ 
        にconsole.log(本)
        innerFunc(){機能
            はconsole.log(この); 
        } 
        innerFunc.call(OBJ)。//显式绑定この
    } 
} 

obj.printThis()。
 

 

ここで、我々はこれを明示的にバインド呼び出すので、この時間は、我々はまったく同じ2本をプリントアウトします、オブジェクトobjあります。

呼び出すに加えて、我々は結合して、その効果を達成するために適用することができます。

概要

これは、実行時に生成され、コンテキストに属する関数の特性は、この点に依存して変化し、この点を修正する方法を結合する、適用する、呼び出し明示的に起動することができるを使用して、関数呼び出し状況に応じて決定されます。

これは我々が矢印機能を使用して自己を避ける際に避けられない問題ですが、また、これとレキシカルスコープの概念を混同しないように、この時点を考えます。

おすすめ

転載: www.cnblogs.com/yu412/p/11550403.html
おすすめ