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

时间:2015-01-04 22:08:21

标签: javascript node.js

此代码有运行时错误:

var person = (function(){

    var Person = {

        init: function() {

        },
    };

    return new Person();

    /*return function(){
        new Person();
    }*/

})();

console.log(person);

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

为什么我无法从自我调用/匿名外部函数返回一个对象?为什么我必须返回一个函数?

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

var person = function(){

    var Person = {

        init: function() {

        },

    };

    return new Person();

    /*return function(){
     new Person();
     }*/

};

console.log(person());

4 个答案:

答案 0 :(得分:8)

  

为什么我无法从自我调用/匿名外部函数返回一个对象?

可以返回一个对象,这不是代码的错误。

您的代码存在的问题是Person是一个对象,而不是一个函数。致电new Person()无效。



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




答案 1 :(得分:1)

这里的问题是您已将Person声明为对象,并且您无法将new Person()与对象一起使用。创建一个"类"在ES5中,您可以创建一个函数。

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

    return new Person();
})();

console.log(person);

http://jsfiddle.net/758zL8v3/

答案 2 :(得分:1)

  

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

因为new运算符创建了 Javascript对象的实例。要创建它,它需要一个构造函数。那就是你要问的功能。

它几乎就像调用典型函数一样

function add() {
  return 1 + 1;
}

add();
// 2

但是当您使用new运算符调用它时,您将创建此函数对象的新实例(函数也是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;
    }
  };
}

答案 3 :(得分:1)

替代是以下Object构造函数:

var person = function(){

    var Person = function(){

        this.init = function() {

        };

    };

    return new Person();

};

您可以阅读有关面向对象编程here的更多信息。