JavaScript – 为什么我们必须从一个自调用函数返回一个函数?

此代码有一个运行时错误:

var person = (function(){ var Person = { init: function() { }, }; return new Person(); /*return function(){ new Person(); }*/ })(); console.log(person); 

它说我必须返回一个函数,而不是一个普通的对象。

为什么我不能从自调用/匿名外层函数返回对象? 为什么我必须返回一个函数?

同样,这个改变的代码也给了我一个类似的错误:

 var person = function(){ var Person = { init: function() { }, }; return new Person(); /*return function(){ new Person(); }*/ }; console.log(person()); 

为什么我不能从自调用/匿名外层函数返回对象?

可以返回一个对象,这不是你的代码有什么问题。

你的代码的问题是Person是一个对象,而不是一个函数。 调用new Person()是无效的。

 var person = (function () { return { name: 'bob' }; }()); console.log(person.name); 

这里的问题是你已经将Person声明为一个对象,并且你不能在一个对象中使用new Person() 。 要在ES5中创build一个“类”,您可以创build一个函数。

 var person = (function(){ var Person = function() { this.init = function() { console.log('Initing!') } }; return new Person(); })(); console.log(person); 

http://jsfiddle.net/758zL8v3/

替代方法是下面的Object构造函数:

 var person = function(){ var Person = function(){ this.init = function() { }; }; return new Person(); }; 

您可以在这里阅读更多关于面向对象的编程。

为什么我必须返回一个函数?

因为new操作符创build了一个Javascript对象的实例。 而要创build它,它需要一个构造函数 。 这就是你正在问的function。

这几乎就像调用一个典型的函数

 function add() { return 1 + 1; } add(); // 2 

但是当你用new操作符调用它的时候,你创build了这个函数对象的一个​​新实例(函数也是在Javascript中的对象)。

 function myAdder() { this.a = 1; this.b = 1; this.add = function () { return this.a + this.b; }; return this; } myObject = new myAdder(); myObject.b = 2; myObject.add(); // 3 

myAdder的对象符号是:

 function myAdder() { return { a: 1, b: 1, add: function () { return this.a + this.b; } }; }