函數的兩個定義和賦值是否有區別?爲什麼這樣「this.foo = new(function(){..})();」與「this.foo = function(){...};」
this.foo = new (function() {..})();
與
this.foo = function(){...};
函數的兩個定義和賦值是否有區別?爲什麼這樣「this.foo = new(function(){..})();」與「this.foo = function(){...};」
this.foo = new (function() {..})();
與
this.foo = function(){...};
在第一個例子,它創建一個函數並執行它,將結果分配至this.foo。在第二個示例中,它創建函數並將函數本身分配給this.foo。
this.foo在第二個例子中,相當於一個函數指針是否正確? – 2010-08-16 16:25:03
@KennyCason:你可以這樣看待它。它將函數分配給當前上下文中的變量「foo」。但是,編寫'function foo(){....}'將完全*做同樣的事情。 – 2010-08-16 16:29:16
@james不完全正確,'function foo()'將它作爲作用域的頂部,'this.foo = function()'在那裏指定它 – Rixius 2010-08-16 16:33:49
你的第一個例子顯然是錯誤的,你真的嘗試過嗎?如果你想使用new
和Function
構造它的工作原理是這樣的:
foo = new Function("function body");
(這是定義一個函數以最壞的方式)
例2是要走的路。
第一個示例中的匿名函數可以返回一個函數,它是然後與'new'運算符一起使用。也許匿名函數是某種對象工廠? – 2010-08-16 16:39:04
其實@Ryan它不會這樣做,除非你在另一層parens中包含該表達式的右側(即整個函數調用)。 「new」運算符至少和()一樣緊密,所以它就像當前寫入的'(new(function(){...}))()'。 – Pointy 2010-08-16 16:41:18
'new function(){...}'很好。它不會和'new Function()'做同樣的事情。它和'new MyConstructor()'完全相同,這是完全有效的。 – 2010-08-16 16:53:32
的主要區別是調用一個「新的」和分配匿名函數來可變
ECMA 262 15.3.2功能: 當功能被稱爲新的表達式的一部分,它是一個構造函數:它初始化新創建的對象。
所以this.foo = new (function() {..})();
創建一個新對象,並把它分配給this.foo
和
this.foo = function(){...};
定義了一個匿名功能,並指定它this.foo
還另一種方式是this.foo = (function() {..})();
(不包括「新「)將調用該函數並將其返回值分配給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
另請參閱:http://stackoverflow.com/questions/2274695/new-function-with-lower-case-f-in-javascript和http://stackoverflow.com/questions/1895635/javascript -singleton-question – CMS 2010-08-16 16:43:12