1

私の理解では、var キーワードを使用せずに変数を定義すると、この変数をウィンドウ オブジェクトに追加するだけと評価されます。一方、まだ定義されていないオブジェクトのメンバーにアクセスしようとすると、未定義と評価されます。だから私はこのようなことをすることができます:

> foo = "bar";
"bar"
> window.foo;
"bar"
> window.bar;
undefined

直接アクセスすると、未定義の変数値 (未定義) を取得できないのはなぜですか?

> bar;
ReferenceError: bar is not defined

私がよく理解していない別のことがありますが、関連していると思われます。コンソールにいくつかのリテラルを入力すると、常にそれ自体が評価されます。1 は 1 に評価され、[1] は [1] に評価されます。関数には値のような性質があるため(一級市民であるため)、関数はリテラルでもあると常に考えていました。しかし、無名関数を評価しようとすると、構文エラーが発生します。

> function() {}
SyntaxError: Unexpected token (

名前付き関数を定義できることは知っていますが、それは未定義と評価されます (関数自体ではなく、どこかで関数を定義します)。では、なぜ関数はリテラルではないのでしょうか?

ありがとう

4

3 に答える 3

3

質問の最初の部分については、ReferenceError とグローバル オブジェクトを参照してください。基本的に、オブジェクトの存在しないプロパティを明示的に参照すると、 undefined が返されます。これは、それを処理して回復したい場合があるためです。ただし、存在しない変数を参照することは決して起こらないはずなので、大声で失敗します。

質問の 2 番目の部分では、名前なしで関数を宣言しようとしていますが、これは不可能です。関数宣言と関数式には微妙な違いがあります。関数名がオプションの関数式は、ステートメントではなく、式の一部としてのみ使用できます。したがって、これらは合法です:

var foo = function () { };

(function () { });

しかし、これではありません:

function () { };

于 2012-09-15T16:24:54.160 に答える
0

「bar」にアクセスするだけでは、スコープが不明です。変数は最初にローカル スコープで検索されます (関数内の場合)。そこに見つからない場合は、window オブジェクトがチェックされます。ただし、発生するエラーは、ローカルスコープに存在しない「バー」を論理的に参照しています。

そのような機能を表示したい場合、何を表示することを期待しますか? 関数には値がなく、その宣言には確かに値がありません。コンソールが関数を実行して結果を返すことができると期待できますが、これも危険です。値を返さない関数を持つことができるだけでなく、関数にはその環境を変更するコードを含めることができます。つまり、コンソールで関数を実行すると、ドキュメントの現在の状態と現在の Javascript の状態が変更される可能性があります。初期化。

于 2012-09-15T16:06:41.683 に答える
0

Javascript は、オブジェクトのプロパティを読み取ろうとすると、undefined.

ただし、存在しない変数の値をグローバル オブジェクトのプロパティとして参照せずに読み取ろうとすると、エラーがスローされます。

この選択を説明する方法はいくつかありますが、元のデザイナーの 1 人にインタビューして、なぜそれを選んだのかを正確に知る必要があります。幸いなことに、動作を理解したら、必要な動作に応じて、何らかの方法でコーディングできます。グローバル変数が定義されていない可能性があることがわかっている場合は、window.xxx先頭に undefined を付けてチェックできます。

いずれにせよ、グローバル変数が存在するかどうかをテストしたい場合は、次のように実行できます。

if (typeof bar !== "undefined")

また

if (window.bar !== undefined)

また、多くの点でまったく同じではないため、コンソールが実際の JavaScript の実行とまったく同じであると想定することには十分注意してください。境界線上の動作をテストする場合は、実際の JavaScript 実行コンテキストでテストすることをお勧めします (jsFiddle は非常に便利です)。

于 2012-09-15T16:23:18.387 に答える