この記事では、JavaScriptの前順と関連手法について説明します。次のように、参照のために共有してください。
変数
繰り返しますが、これら2つの小さな例のエラー比較プロンプトから始めます。
アラート(Y1); //コードセグメント1Var y1 = 'dddd'; alert(y2); //コードセグメント2 // alert(typeof y2); y2 = 'xxxxx';
最初に、1つが未定義のプロンプトをプロンプトし、もう1つが未定義の変数の誤差を投げる理由について考えてみましょう。 。まず、JavaScriptの解析プロセスを見てみましょう。
実行プロセスの前に、JavaScriptはイベント「Preparsement」を行います。解析エンジンは、ブロックレベルですべてのVAR変数の作成を実行し、初期値:未定義です。このようにして、最初の例が定義されていない理由が明らかです。
したがって、最初のコードは実際には同等です
var y1; alert(typeof y1); //当然、その値はundefinedy1 = 'dddd'です。
なぜ2番目のコードが再び間違ったものを投げたのですか?それはもはや「パルス前」の段階に属していません(ここでは、ブラウザはスクリプトタグに遭遇したときに2つのことを行うと仮定します:実際にはこれらの2つのことだけではありません)。ただし、実行段階では、エラーをスローする理由は、JSが実行セグメント状態のY2の状態を知らないことです(Y2の情報は格付け前段階ではキャプチャされませんでした)、そしてもちろん、未定義のエラー情報を投げます。ここには別の問題が関係しています:JSは弱いタイプの言語であり、変数は定義なしで使用できます。
物事が起こる理由は常にあります。 JavaScriptには常に多くの奇妙な機能があり、読み取りと書き込みの変数が不均一になります。未定義の変数は書くことができるだけで、読み取られません。何を書くことができますか?誰もがこの執筆方法に精通しています:
Y2 = 'Exam'; //定義操作が表示される前(つまり、独自のスコープがない前)、この操作はこのコードを検討してグローバル変数を定義し、ウィンドウにプロパティY2を登録し、試験に割り当てます
しかし、それを読むとき、JSエンジンはそれに関する関連情報を見つけることができないため、それは独自の気性で作用し、ためらうことなく未定義の間違いを犯します。これがJSのゲームのルールです。それでも、なぜあなたはそのタイプを手に入れることができるのですか? JSのオブジェクトの操作を覚えておいてください。存在しないオブジェクトにアクセスすると、未定義をプロンプトします(現在、ウィンドウオブジェクトの属性であるため)。
注:ここでは、読み取りと書き込みの不均一な変数が変数にのみ使用され、オブジェクトのすべてのプロパティが読み取られることを区別する必要があります。この機能は存在しません。それが存在しない場合、それは未定義を促します。
結論は
この時点で、私の考えは次のとおりです。変数とオブジェクトの書き込み操作には特定の類似点があります。ただし、それぞれには、読書操作のための独自のルールがあります。このため、上記の問題に遭遇します。
このようにして、次の質問に簡単に答える必要があります。
if(!( 'a' in window)){var a = 1;} alert(a);関数
それを拡張するために、機能します。上記の事前格付けを覚えておいてください。 javaScriptの事前分析では、VAR変数の事前定義に加えて、関数の定義を抽出することも含まれているため、関数はスクリプトのどこでも定義し、どこにでも呼び出すことができます。それ以前に限定されません。
ただし、機能の定義方法には、VARの方法を使用して関数を宣言する文字通りの定義方法が含まれています。以下を参照してください
アラート(Typeof Y3); // result?var y3 = function(){console.log( '1'); }この契約を覚えておいてください:宣言後に電話が表示されなければなりません。なぜ?上記を理解している場合、ここでの答えは実際には明確です。 VARを装飾すると、JavaScriptエンジンは初期値を未定義にします。このようにして、宣言の前にそれを呼び出すと、JavaScriptエンジンはまだ真の値を取得していません。「XXXは関数ではない」というエラーを自然に報告します。これはまた、両方の関数宣言が宣言と呼び出しの順序に関連している理由を明確にし、もう1つはそのような制約を持っていません。
結論は
これは、JSの実行と動的な変更の結果である関数であり、変数の分析前のルールに従っています(上記で警告する場合、リテラル関数の情報は取得されませんでした)。
2つの混合物の場合はどうなりますか。以下を見てください、Y4の変数と関数の両方があります。
アラート(タイプY4); // result?function y4(){console.log( 'y4')} var y4;JavaScriptは事前抑制で優先度が高いため、Y4は当然関数タイプですが、Y4が割り当てられた後(JSエンジンは実行中)、JSへの割り当て操作は関数宣言をオーバーライドします。それで:
alert(typeof y5); var y5 = 'angle'; function y5(){console.log( 'ghost'); }アラート(y5);最初のアラート結果は、JS実行プロセスのトップにあるため、関数です。アラートが名前が変更された2回目は、その値が5に書き換えられました(以下の関数の定義位置に混乱しないでください)。
JSの分析と実行について考えて、私は多くの質問に対する答えが自然に浮上していることに突然気づいたことに気付きました。その記事の著者が言ったように、「実行環境の概念を理解したら、オブジェクト、閉鎖、語彙スコープ、スコープチェーンを呼び出し、JS言語の多くの現象を簡単に解決できます。」
今振り返ってみると、この信じられないほどの言語でさえ、それにまでさかのぼることができる多くの理由があります。
より良いパラメーターの判断を下す方法
上記のことについて多くのことを議論した後、実際の開発にどのように近づくことができますか? JavaScriptの読み取りと書き込みの不均一なので、エラーを報告せずにパラメーターの判断を下すことを避けるにはどうすればよいですか?
例えば:
if(cusvar){//ここでの判断は暗黙の問題です。 }より厳密になる方法。
if(window ['cusvar']){//エラーを報告しないことを確認してください。 //またはそのような判断は、実行可能なwindow.cusvar |でもありますtypeof cusvar!== 'undefined' // work}最後に、別の小さなクイズが追加されています(事前包装と実行の分離を理解してください)
var y7 = 'test'; function fun1(){alert(y7); var y7 = 'sex';} fun1();JavaScript関連のコンテンツの詳細については、このサイトのトピックをご覧ください:「JavaScriptの切り替え効果とテクニックの要約」、「JavaScript検索アルゴリズムスキルの要約」、「JavaScriptアニメーション効果とテクニックの概要」、「Javascriptエラー、および「Javascriptデータ構造」の概要」の概要の要約の要約をご覧ください。 JavaScriptトラバーサルアルゴリズムとテクニック」、および「JavaScriptの数学的操作の使用法の要約」
この記事がみんなのJavaScriptプログラミングに役立つことを願っています。