只想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个变量:foo
,a
,b
,我倾向于将它们视为全局变量。
在浏览器中This variables
可以从我想要的任何文件中调用/使用 - 因为它是全局的。一旦文件被src属性加载this variables,
就可以了,并且将直接由外部文件中的代码使用。这是我现在的理解。这在Node中并不成立。
问题:
为什么a
可以从远程文件访问,但foo function
不是?
我想特别了解run-time
和parse-time
进程如何依赖于节点 - 我的意思是如果这个编译过程是单独依赖于每个文件 - 那么一切都是如何在一起回到app.js
并计算在那里?实际发生了什么?
能否或不能看到app.js脚本是一个庞大的巨大脚本,它是从多个文件中拉出来并逐行同时运行的?
感谢您抽出宝贵时间阅读,评分并回复此问题。
答案 0 :(得分:1)
在
var x; x = 0;
有两部分:变量声明和初始化。它的解释与编写完全相同:
<script>
当JavaScript源文件通过var
标记导入浏览器时,脚本将在全局上下文中进行评估,因此函数外部的window
声明会创建全局变量。在浏览器中,全局变量是全局var
对象的属性。在Node.js中,情况有所不同:模块在非全局的每模块上下文中进行评估,因此函数之外的{{1}}声明不会创建真正的全局变量。