ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript学習ノート3 範囲_基礎知識

Javascript学習ノート3 範囲_基礎知識

WBOY
WBOYオリジナル
2016-05-16 18:36:51867ブラウズ

Javascript では、グローバル環境自体がオブジェクトです。ブラウザ ホストでは、このオブジェクトはウィンドウですが、JavaScript が埋め込み環境などの他の非ブラウザ ホストで使用される場合は、他のオブジェクトになる可能性があります。
ここで概念を修正したいと思います。多くの人は、JavaScript はブラウザーでのみ使用されると考えています。実際、Javascript は Web 以外の多くの状況でも使用できるとのことです。組み込みベースのアプリケーション分野は素晴らしいです。もちろん、私はこれらの伝説しか聞いたことがありません。
本題に戻りますが、var i=1 と書くと、実際にはウィンドウ スコープで変数を宣言していることになります。
i=1 と書くと、ウィンドウ属性を宣言します。
このコード部分を見てください:


[Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります
]

これコードは個別に出力されます。結果は次のようになります。未定義の世界、ようこそ中国、こんにちは中国。
それらを個別に説明します。
上記では、JavaScript がプリコンパイルされると、すべての var 変数が作成され、デフォルトの変数が作成されると述べました。値は未定義です。次に例を示します。
次のようなコードを記述できます。

[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、更新して実行する必要があります
]
このセクションを実行します。 スクリプトを作成すると、最初に unknown がポップアップ表示され、次に b が存在しないことを示すスクリプト エラーが表示されます。 a はプリコンパイル プロセス中に作成され、未定義に初期化されたことがわかりますが、b は実際の実行時に順次にのみ解釈できます。実際、プリコンパイルされた Javascript コードは次のようにほぼ理解できます:
[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、それを実行するために更新する必要があります
]

これについては次に説明します。関数スコープの問題です。コードが関数に実行されると、JavaScript エンジンは自動的に新しいスコープを作成し、この新しいスコープを現在のスコープの子スコープとして使用し、現在のコードを切り替えます。スコープをこの新しいスコープに変更します。コードが関数を終了すると、このスコープは破棄され、コード スコープは親スコープに戻ります。
さて、準備はほぼ完了しました。次に、最初の質問、なぜ未定義の世界が出力されるのかについて説明します。 まず、Test メソッドに入るときにコードがプリコンパイルされ、新しいスコープが開かれ、グローバル スコープがその親スコープとして使用されます。次に、Test でメソッドをプリコンパイルします。上記のコードと同様、Test メソッドがプリコンパイルされた後のメソッド本体は次のようになります。 コード

コードは次のとおりです。


function Test() {
var a = unknown;
alert(a " " b); ;
b = "china";
alert(a " " b);


もちろん、b は現在のスコープ内に見つからないため、彼の b="world" は、親スコープ、つまりグローバル スコープの下にあります。それでこの結果が生まれました。
ようこそ中国が二度目に現れました。言うことは何もありません。
3 回目で、hello china が表示されます。 var a はメソッド Test の単なるローカル変数であり、b は事前に宣言されていないため、対応する定義を見つけるために親スコープに移動することがわかります。
それでは、次に、このメソッドのいくつかのバリエーションを見てみましょう。

[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、 を実行するために更新する必要があります]
首先,我们将方法体内的var a改成a,我们先不看答案,直接来分析,首先,在预编译阶段,方法体内几乎没有任何改变,因此此时a和b一样,都要去他们的父作用域中去寻找,因此第一次出的结果应该是hello world,第二次没什么说的:welcome china,第三次由于a和b在本作用域内都没有事先定义,因此都是再改变父作用域内的值,因此应该输出welcome china.
我们继续:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

和上面的分析一样,应该输出undefined undefined,welcome china,hello world.
继续:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

应该是undefined world,welcome china,hello china.
经试验,都没问题, 不知道你明白了么?
因此我们可以得出,每个变量在找不到自己的定义时,都会沿着作用链向上寻找,这样就很可能会出现未预知的错误,给排错添加了很多困难。更麻烦的是,还可能会对父作用域上的变量值进行修改,因此我们在声明变量时应该尽量加上var,尽管Javascript并不强迫我们这样做。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。