闭合风格有什么不同

doe*_*man 22 javascript

javascript中有两种流行的闭包样式.第一个我叫匿名构造函数:

new function() { 
  var code...
}
Run Code Online (Sandbox Code Playgroud)

内联执行功能:

(function() {
  var code...
})();
Run Code Online (Sandbox Code Playgroud)

这两者之间的行为有何不同?一个人比其他人"更好"吗?

oll*_*iej 10

两种情况都会执行该函数,唯一真正的区别是表达式的返回值可能是什么,以及"this"的值将在函数内部.

基本上是行为

new expression
Run Code Online (Sandbox Code Playgroud)

实际上相当于

var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
    result = tempObject;
Run Code Online (Sandbox Code Playgroud)

虽然tempObject和result当然是瞬态值,你永远看不到(它们是解释器中的实现细节),并且没有JS机制来执行"不是对象"检查.

从广义上讲,由于需要为构造函数创建此对象,因此"new function(){..}"方法将会变慢.

这说明这应该不是真正的区别,因为对象分配并不慢,你不应该在热代码中使用这样的代码(由于创建函数对象和相关闭包的成本).

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


doe*_*man 5

@Lance:第一个也在执行.将它与命名构造函数进行比较:

function Blah() {
    alert('blah');
}
new Bla();
Run Code Online (Sandbox Code Playgroud)

这实际上也是在执行代码.匿名构造函数也是如此......

但这不是问题;-)