2011-04-30 175 views
4

以下片段是否完全相同?如果没有什么尊重?JavaScript块范围与功能

var x = (function() { 
    ... //a 
    return function(){ 
     ... //b 
    }; 
})(); 

var x; 
{ 
    ... //a 
    x = function(){ 
     ... //b 
    }; 
} 
+0

@JohnS代码,请不要粘贴到标题这样。将您的代码发布到正文中。 – JohnP 2011-04-30 11:23:43

+0

@JohnP你说的对,但是你的标题太笼统了,就像“我的代码有什么问题?” – 2011-04-30 11:24:43

+0

@JohnS但这就是你问的。将代码粘贴到标题中并不能使其可读。随时为您的问题提出一个更好的问题陈述 – JohnP 2011-04-30 11:25:46

回答

6

有一个主要区别:在JavaScript中,块不会引发新的变量范围。因此,您不能在// a代码块中定义私有变量。比较

var x = (function() { 
    var v = 42; 
    return function(){ 
     return v; 
    }; 
})(); 
// v; would yield ReferenceError: v is not defined, so you need to call x 

var x; 
{ 
    var v = 42; 
    x = function(){ 
     return v; 
    }; 
} 
// v is 42 here, that's not what's intended. 
0

一个主要的区别是,在执行...//a时,X不存在。现在在你的情况下,在这两种情况下,它是undefined,但通常来说,可能在...//a期间访问x变量,而在第一种情况下不可以。

否则在你的情况下它是相同的。毕竟在你的情况下,代码基本上被重构为一个单独的函数,就像任何其他语言一样。

+2

还有一件事:'{var z = 1;}'将在窗口命名空间中创建一个变量z,而'(function(){var z = 2;}()) '不会污染全局名称空间。这就是为什么功能选项是首选 – 2011-04-30 11:28:31