JavaScript:变量声明,在运行时和解析时在浏览器和nodejs之间是不同的?为什么呢?

时间:2016-04-05 14:47:33

标签: javascript node.js variables express

只想100%肯定我得到了这个。为什么会这样? 请查看以下控制台打印件。输出应该相同但不是。

节点控制台。

// 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个变量:fooab,我倾向于将它们视为全局变量。

在浏览器中This variables可以从我想要的任何文件中调用/使用 - 因为它是全局的。一旦文件被src属性加载this variables,就可以了,并且将直接由外部文件中的代码使用。这是我现在的理解。这在Node中并不成立。

问题:

为什么a可以从远程文件访问,但foo function不是?

我想特别了解run-timeparse-time进程如何依赖于节点 - 我的意思是如果这个编译过程是单独依赖于每个文件 - 那么一切都是如何在一起回到app.js并计算在那里?实际发生了什么?

能否或不能看到app.js脚本是一个庞大的巨大脚本,它是从多个文件中拉出来并逐行同时运行的?

感谢您抽出宝贵时间阅读,评分并回复此问题。

1 个答案:

答案 0 :(得分:1)

  1. var x; x = 0;
    

    有两部分:变量声明和初始化。它的解释与编写完全相同:

    <script>
  2. 当JavaScript源文件通过var标记导入浏览器时,脚本将在全局上下文中进行评估,因此函数外部的window声明会创建全局变量。在浏览器中,全局变量是全局var对象的属性。在Node.js中,情况有所不同:模块在非全局的每模块上下文中进行评估,因此函数之外的{{1}}声明不会创建真正的全局变量。