有两个受欢迎的封闭式在javascript。第一我打电话 匿名的构造:

new function() { 
  var code...
}

联执行功能:

(function() {
  var code...
})();

是有差异的行为之间的那两个?是一个"更好"?

有帮助吗?

解决方案

这两种情况下将执行的功能,唯一真正的区别是什么样的回报价值的表达可能是、和什么价值"这"将内部的职能。

基本行为

new expression

实际上等同于

var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
    result = tempObject;

虽然当然tempObject和结果是短暂的价值观,你可以永远看不到(他们是执行细节的解释),和没有JS机构来做这"不是一个目的"检查。

广义而言的"新的功能(){..}"的方法会比较慢是由于需要创建这个目的构造。

这说的这应该是不是一个真正的差别为目的分配不是缓慢的,你不应该使用这样的代码,在热代码(由于成本创造的功能物体和相关的封闭).

编辑:有一件事我意识到我错过了这个是的 tempObject 将获得 expressions原型,例如。(之前 expression.call) tempObject.__proto__ = expression.prototype

其他提示

@兰:第一个也是执行。比较一个名为构造:

function Blah() {
    alert('blah');
}
new Bla();

这实际上是还执行代码。这同样适用于匿名的构造...

但是,这不是问题;-)

他们都创建一个封闭的执行代码块。作为一个论的风格我喜欢的第二的原因有两个:

它不会立即显而易见的扫一眼第一,代码实际上将可以执行;线 看起来像 它是 创建 一个新的功能,而不是执行它作为一种构造,但这并不是什么实际发生的事情。避免的代码没有做什么这看起来像是在做!

还的 (function(){ ... })(); 好的穿插标记,以便可以立即看到你进入和离开的封闭的范围。这是良好的,因为它的警报的程序员读到的范围的变化,并且是特别有用的,如果你正在做一些后处理的文件,例如用于缩小.

好了,我做了一个网页是这样的:

<html>
<body>
<script type="text/javascript">
var a = new function() { 
  alert("method 1");

  return "test";
};

var b = (function() {
  alert("method 2");

  return "test";
})();

alert(a);  //a is a function
alert(b);  //b is a string containing "test"

</script>
</body>
</html>

令人惊讶的是(我)它提醒两个法"1"和方法2的"。我没想到"1的方法",以警惕。的区别是什么样的价值观a和b。一是功能本身,而b就是串的功能返回。

第二个例子将执行的功能之后,创建它。

编辑:这不是真的。

是的,还有两者之间的差异。

两者都是匿名的功能和执行在完全相同的方式。但是,两者之间的区别是,在第二种情况下范围的变量是有限制的匿名的功能本身。有没有机会意外地加入变量的全球范围。

这意味着通过使用第二种方法,你是不是搞乱了全球变量范围,这是良好的,因为这些全球变量值可能会干扰某些其他全球变量,你可以用一些其他图书馆或正在使用在第三方图书馆。

例如:

<html>
<body>
<script type="text/javascript">

new function() { 
a = "Hello";
alert(a + " Inside Function");
};

alert(a + " Outside Function");

(function() { 
var b = "World";
alert(b + " Inside Function");
})();

alert(b + " Outside Function");
</script>
</body>
</html>

在上述码输出的东西,如:

你好内部的功能
你好外的功能
世界内部的功能

...然后,你会得到一个错误作为"b"不是定义之外。

因此,我认为,第二种方法是更好地...安全!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top