2017-04-06 106 views
0

我有下面的代码,我期望的结果将打印2,2.为什么在浏览器和nodeJS中运行以下代码存在差异?

当我在nodeJS控制台运行它,我得到了未定义,未定义。 当我在Chrome中运行它时,我得到了期望的值。

我的问题,这个结果有什么不同?

var a = 2; 
function foo(){ 
    console.log(this.a); 
} 

(function(){ 
    foo(); 
}()) 

function doFoo(fn){ 
    fn(); 
} 

var obj ={ 
    a:3, 
    foo:foo 
}; 

doFoo(obj.foo); 

回答

2

Node.js不在全局范围内执行代码。相反,每个文件都包含在一个IIFE中,以便每个文件都有自己的范围。所不同的是,在浏览器中,var a = 2是一个全局变量,而在node.js中,var a = 2不是全局变量。

由于您的代码打印全局变量a,所以在浏览器中将会是2。在node.js中,您尚未定义a,因此它会打印未定义的。

为了使代码相同,更改var a = 2a = 2以声明全局变量而不是局部变量。

+0

正确,浏览器中的全局变量是“窗口”的属性。所以当你声明var a = 2;基本上这会创建window.a = 2; – Pratyush

+0

@王绍豪:如何在javascript中声明局部变量:'var a'。如何在javascript'let a'中声明块变量。如何在javascript中声明全局变量:'a'。在javascript中,不使用'var'或'let'关键字来分配变量就会创建一个全局变量。 – slebetman

+0

谢谢!我会将其标记为答案。 –

相关问题