Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么会这样;this.foo=new(函数(){..})()&引用;vs.“;this.foo=函数(){…}&引用;_Javascript - Fatal编程技术网

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