我们知道在Chrome窗口中,执行以下代码时
function test(){
console.log("function is " + this.test);
}
test();
test
作为函数添加到window
对象,并显示
function is function test(){
console.log("function is " + this.test);
}
在控制台中。
当我将相同的代码放在文件sample.js中时,使用node
nodejs$ node sample.js
它正在给予
function is undefined
但是当我直接在node
终端
nodejs$ node
> function test(){
... console.log("function is " + this.test);
... }test();
它显示与浏览器相同的输出。
任何人都可以解释为什么会发生这种情况以及V8引擎如何执行Javascript文件?想了解更多信息,如果可能的话请提供相关文章和教程的链接。
答案 0 :(得分:1)
Node中的全局对象行为不同。模块有自己的范围。您只能使用" global.foo = true"
创建一个真正的全局答案 1 :(得分:0)
好问题!
在sample.js
function is function test(){
console.log("this is " + this);
}
test();
Chrome显示当时test()正在DOMWindow范围内运行:
this is [object DOMWindow]
节点显示当时test()正在对象global的范围内运行:
this is [object global]
但由于test()
已被定义为模块sample.js的一部分,this.test
在test()
运行时未定义。
答案 2 :(得分:0)
基本上,@ ill提到的模块有own scope
您可以假设该节点将所有module
代码包装在
(function () {
// Your module code goes here
})()
在执行之前。因此,为模块本身创建一个本地范围。
<强>原因:强> 它将防止全球范围受到污染
场景:假设您有module
示例,其中包含测试功能,另一个模块说 sample2 ,其中还包含 test 函数。如果节点没有为您的样本和sample2创建本地范围,则 test 函数中的任何一个都会覆盖另一个。
此外,您需要了解节点仅对模块的module.exports
对象感兴趣
示例:强>
var sample = 'you will not see me in global object';
hai = 'but i will be there';
test = function () {
console.log("function is ", this.test);
}
console.log(global);
test();
此处 hai 和 test 之前没有var
因此它在浏览器窗口范围内变为global
。现在尝试在本地节点实例中执行上述操作
hai: 'but i will be there',
test: [Function] }
function is function () {
console.log("function is ", this.test);
}
您应该看到global
对象属性的大列表以及测试函数的定义。 示例将不在列表中,但