2016-04-05 4 views
-1

私はこれを確かに100%確実にしたいです。なぜこれが起こるのですか? 次のコンソールのプリントを見てください。出力は同じでなければなりません。JavaScript:実行時と解析時の変数宣言はブラウザとnodejで異なりますか?どうして?

ノードコンソール。

// ReferenceError: foo is not defined 
// I'm a, A can be printed! 
// ReferenceError: b is not defined 

ブラウザのコンソール。

// I'm foo 
// I'm a, A can be printed! 
// I'm b, B can be printed! 

コードが完成しました。このコードは、両方のコンソールでまったく同じことを行うと仮定しています。

ノードmain.js

function foo(){ 
    console.log("I'm foo!"); 
} 
a = "I'm a"; 
var b = "I'm b"; 
require("/remoteFile")(); // this calls the function inside the remoteFile which internally calls foo(), and the console.logs of a and b. 

ノードremoteFile.js

module.exports = function(){ 
    //console.log("Remote file loaded!"); 
    foo() 
    console.log(a, "A can be printed!"); 
    console.log(b, "B can be printed!"); 
} 

ブラウザコード: のindex.html:

<script> 
    function foo(){ 
     console.log("I'm foo!"); 
    } 
    a = "I'm a."; 
    var b = "I'm b." 
</script> 
<script src="/addRemoteJavascript.js"></script> 

addRemoteJavascript.js:

(function(){ 
    //console.log("Remote file loaded!"); 
    foo(); 
    console.log(a, "A can be printed!"); 
    console.log(b, "B can be printed!"); 
})(); // this functions will run as soon as it's loaded. 

すべての3つの変数ので:fooa、任意の関数の外側で宣言bウェア、私は彼らのグローバル変数を検討する傾向があります。

ブラウザでThis variablesは、必要なファイルから呼び出すことができます - グローバルであるためです。ファイルがsrc属性によってロードされると、外部ファイルの内部でコードによって直接使用されるになります。これは私の理解です。これはノードでは成立しません。

質問:

aは、リモートファイルからアクセス可能ですが、foo functionではないのはなぜ?私はrun-timeparse-timeプロセスが依存している、特に方法を知りたい

はノードで起こる - 私は意味、このコンパイル処理は、個々のファイルに対して行わ頼るされている場合 - すべてがどのように、その後が、戻って一緒にapp.jsにし、そこに算出しましたか?実際に何が起こっていますか?

app.jsスクリプトは、複数のファイルから取り出され、同時に1行ずつ実行される膨大な膨大なスクリプトとして表示されることはできますか?

この質問を読んでいただきありがとうございます。

var x = 0; 

+1

"通過"の概念は言語仕様の一部ではなく、必ずしも特定の環境の仕組みではありません。変数の宣言と変数の初期化は別々の概念です。初期化は簡単な代入式のようなものです。それ以外に、あなたが何を質問しているのかを知るのは難しいです。 – Pointy

+0

この質問について不明な点は何ですか?あなたはその壁を取り除いてトピックに集中できますか?この質問を再開できると確信しています。私はダウンボットを削除します。 –

+0

@TomášZato問題ありません。助けてくれてありがとう。私はこの状況を説明するために最善を尽くそうとしています。これはまだうまくない場合は...多分それは問題ではない。私はこの質問を完全に取り除き、私が何を求めているかについてもっと理解した後、もう一度やり直します。 – AIon

答えて

1
  1. 二つの部分がある:変数宣言、及び初期化が。JavaScriptのソースファイルが<script>タグを介してブラウザにインポートされると、スクリプトはグローバルコンテキストで評価され

    var x; x = 0; 
    
  2. 、その機能の外var宣言:それが書かれていたかのようにまったく同じ解釈されますグローバル変数を作成します。ブラウザでは、グローバル変数はグローバルwindowオブジェクトのプロパティです。 Node.jsでは、モジュールがグローバルでないモジュールごとのコンテキストで評価されるため、関数の外にあるvar宣言では、は本当にグローバル変数を作成しません。

関連する問題