题
有两个受欢迎的封闭式在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
将获得 expression
s原型,例如。(之前 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"不是定义之外。
因此,我认为,第二种方法是更好地...安全!