Javascript 为什么会这样;this.foo=new(函数(){..})()&引用;vs.“;this.foo=函数(){…}&引用;
两种功能的定义和分配有什么不同吗Javascript 为什么会这样;this.foo=new(函数(){..})()&引用;vs.“;this.foo=函数(){…}&引用;,javascript,Javascript,两种功能的定义和分配有什么不同吗 this.foo = new (function () {..})(); vs 在第一个示例中,它创建并执行一个函数,将结果分配给this.foo。在第二个示例中,它创建函数并将函数本身分配给这个.foo。您的第一个示例完全错误,您实际尝试过吗?如果要使用new和函数构造函数,其工作原理如下: foo = new Function("function body"); (这是定义函数最糟糕的方式) 示例2就是方法。主要区别在于使用“new”调用函数,并将匿名函
this.foo = new (function () {..})();
vs
在第一个示例中,它创建并执行一个函数,将结果分配给this.foo。在第二个示例中,它创建函数并将函数本身分配给这个.foo。您的第一个示例完全错误,您实际尝试过吗?如果要使用
new
和函数
构造函数,其工作原理如下:
foo = new Function("function body");
(这是定义函数最糟糕的方式)
示例2就是方法。主要区别在于使用“new”调用函数,并将匿名函数分配给变量 ECMA 262 15.3.2: 当函数作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象 所以
this.foo=new(函数(){..})()
创建一个新对象并将其分配给this.foo
及
this.foo=function(){…}
定义匿名函数并将其分配给this.foo
另一种方法是this.foo=(函数(){..})()
(不带“new”)将调用函数并将其返回值分配给this.foo
在您的情况下,如果您发出警告:
var foo = new (function () {})();
var bar = function() {};
var baz = (function () {return "boo";})(); // without the "new"
alert(foo); // will alert [object Object], the newly created object
alert(bar); // will alert function) {}, the function itself
alert(baz); // will alert "boo", the functions return value
第二个例子中的this.foo相当于一个函数指针,对吗?@KennyCason:你可以这样看。它将函数分配给当前上下文中的变量
foo
。但是,编写function foo(){….}
将做完全相同的事情。@james不完全一样,function foo()
将在作用域的顶部对其进行赋值,this.foo=function()
将其分配到相应的位置。第一个示例中的匿名函数可以返回函数,然后与new
运算符一起使用。也许匿名函数是某种对象工厂?实际上@Ryan它不会这样做,除非您将该表达式的右侧(即整个函数调用)包装到另一层参数中。“new”操作符的绑定至少与()一样紧密,因此它就像当前编写的(new(function(){…}))()
。new function(){…}
很好。它与newfunction()
的功能不同。它的作用与新建MyConstructor()相同,这是完全有效的。@Pointy-我需要另一层括号,你说得对,但我认为它更像foo=new(function(){…}())()代码>无论哪种方式,都不是一种非常容易使用的语法,而且它也违背了对象工厂的目的。另请参见:和
var foo = new (function () {})();
var bar = function() {};
var baz = (function () {return "boo";})(); // without the "new"
alert(foo); // will alert [object Object], the newly created object
alert(bar); // will alert function) {}, the function itself
alert(baz); // will alert "boo", the functions return value