Node JS简单的功能和`this`

时间:2012-01-15 08:45:19

标签: javascript node.js v8

我们知道在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文件?想了解更多信息,如果可能的话请提供相关文章和教程的链接。

3 个答案:

答案 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.testtest()运行时未定义。

答案 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对象属性的大列表以及测试函数的定义。 示例将不在列表中,但