35
alert(myVar1);
return false;
var myVar1;

上記のコードは、IE、FF、およびOperaでエラーをスローし、returnステートメントを関数に含める必要があることを示しています。ただしundefined、SafariとChromeでは機能します(表示されます)。

上記のコードはグローバルスコープで記述されています。すべての機能の外。

何らかの理由?

4

5 に答える 5

36

JavaScriptでは、変数はスクリプトの先頭に移動されてから実行されます。だからあなたが実行するとそれはします

var myVar1;
alert(myVar1);
return false;

これは、JavaScriptには実際には字句スコープの真の意味がないためです。これが、巻き上げが問題を引き起こすのを防ぐために使用される領域の上部ですべての変数を宣言することがベストプラクティスであると考えられている理由です。JSLintはこれについてうめき声を上げます。

これはそれを説明する良い記事です: http ://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

返品は無効です。真の巻き上げの例(上記のリンクから取得)を実行したい場合は、

var foo = 1; 
function bar() { 
    if (!foo) { 
        var foo = 10; 
    } 
    alert(foo); 
} 
bar();

これは10を警告します

以下は私の理解であり、私はそれをどこかで読んだことがありますが、私が読んだすべての情報源を見つけることができないので、訂正の余地があります。

このアラートは、JavaScriptJITの違いのおかげです。TraceMonkey(http://ejohn.org/blog/tracemonkey/)JavaScriptを使用して簡単な静的分析を実行し、次にJITを実行してから実行しようとすると思います。それが失敗した場合、明らかに何も機能しません。

V8は静的分析を行わず、JITに移動してから、何かを実行します。Pythonに似ています。Chromeの開発者コンソール(Windowsではctrl + shift + j)でスクリプトを実行すると、エラーがスローされますが、アラートを表示するためにも実行されます。

于 2010-09-16T10:28:50.273 に答える
18

時々、巻き上げは間違った印象を与えるかもしれない方法で説明されます。つまり、変数と関数は、以下のコードで示されているように、実際には正しくない、物理的に上に移動されたかのようにJavaScriptエンジンによって巻き上げられます。

console.log(a);
var a = 'Hello World!';

コンソールに表示されるのはundefined、ではない'Hello World'ので、次のコードの動作を取得しました

var a;
console.log(a);
a = 'Hello World!';

の振る舞いではありません

var a = 'Hello World!';
console.log(a);

これは、変数と関数の宣言が最上位のステートメントに移動されていることから印象を受ける可能性があります。

しかし、JavaScriptは実際にはコードをどこにも移動していません。JavaScriptの実行コンテキストを理解する必要があります。作成フェーズと実行フェーズの2つのフェーズがあります。作成フェーズでは、これらの変数と関数のためにメモリスペースが作成され、人々はこのステップを巻き上げと混同しているようです。JavaScriptは実際にはコードをどこにも移動していません。何が起こるかというと、JavaScriptはすべてのコード、つまり変数と関数のためのメモリスペースを作成し、関数は完全にメモリに配置できますが、変数の場合、割り当ては実行コンテキストの実行フェーズで処理されます。したがって、varを実行するとa = 'Hello World!'、JavaScriptエンジンは次の値を認識します。a実行コンテキストの実行フェーズで実行を開始すると、プレースホルダーが未定義になり、JavaScriptではすべての変数が最初に未定義に設定されます。したがって、巻き上げに頼って未定義を見るのは良くありません。したがって、コードの上に変数と関数を宣言することは常に良いことです。

于 2015-09-09T09:32:50.627 に答える
12

ECMA-262エディション3のセクション12.9(75ページ)には次のように記載されています。

ECMAScriptプログラムに、 FunctionBodyreturn内にないステートメントが含まれている場合、構文的に正しくないと見なされます。

つまりreturn、関数の外側は構文エラーです。構文エラーが発生した場合、コードは実行されません。あなたが書いたかのようにあなたの例について考えてください:

alert(myVar1);
return false;
syntax error))))))))))))))))));

さらに、セクション16(157ページ)には次のように記載されています。

実装では、次の種類のランタイムエラーのインスタンスを構文エラーとして扱い、早期に報告する場合があります。

  • return、break、continueの不適切な使用。

Firefoxのエンジンなど。al。return(つまり、グローバルスコープで許可するJavaScript実装)は、次の句(同じセクション内)でグローバルスコープでの実装定義が許可されていると仮定すると、準拠している可能性があります。return

実装は、以下を除いて、指定されたとおりにすべてのエラーを報告するものとします。

  • 実装は、この仕様で説明されているもの以外の追加のタイプ、値、オブジェクト、プロパティ、および関数を提供する場合があります。これにより、コンストラクト(グローバルスコープで変数を検索するなど)が、エラー(ReferenceErrorなど)をスローする代わりに、実装定義の動作をする可能性があります。
于 2010-09-16T16:57:46.787 に答える
3

このコードはほとんど意味がありません:

  • var myVar1実行されません。
  • あなたreturn false;が関数にいないので、は物を返しません

Opera、IE、FFはエラーをスローする権利があります。これは、関数内にいない限り戻ることができないため、このコードは実際には無効であるためです。

SafariとChromeで機能する場合は、使用するjavascriptエンジンがバグのあるコードを処理する準備ができているためである必要があります。私の推測では、彼らは「return」を見て、それをドロップするか、ある種の。に置き換えbreakます。

関数の詳細:http ://www.w3schools.com/js/js_functions.asp

于 2010-09-16T10:06:30.667 に答える
0

これはJavaScriptの巻き上げです。つまり、値を保持していない変数の値を出力しようとしています。

Javascriptは上記のコードを次のようにレンダリングします:-

var myVar1
alert (myVar1)
return false

さらに明確にするために、私はリンクjavascript hoistingを参照しました: http ://www.ufthelp.com/2014/11/JavaScript-Hoisting.html

于 2014-11-16T13:03:12.927 に答える