0

在下面的代码中

(function x() {
var j = function() { alert("234234"); }
return {
    s: j
}
})()

var x1 = new x();
x1.s();

如何调用方法 j()?或者在此之前我应该​​问,有没有办法创建函数 x() 的实例,因为这就是正在发生的事情。请看小提琴http://jsfiddle.net/e5k6bdvn/

4

2 回答 2

8
  1. 不要给自调用函数起一个名字(除了使它更容易在堆栈跟踪中找到之外,它几乎没有什么好处,此时您不应该需要它,并且它在旧 IE 中存在内存泄漏)
  2. 不要两次调用自调用函数
  3. 不要将自调用函数视为构造函数(通过调用它new
  4. 捕获自调用函数的返回值

这样的:

    var x = (function () {
        var j = function() { alert("234234"); };
        return {
            s: j
        };
    })();
    
    x.s();


或者,如果您想以相同的方式创建多个对象:

  1. 不要使用自调用函数
  2. x多少次就打多少次

这样的:

    function x () {
        var j = function() { alert("234234"); };
        return {
            s: j
        };
    };

    var x1 = x();
    var x2 = x();
    x1.s();


或者,如果你想创建一个构造函数:

  1. 不要从中返回任何东西
  2. 使用原型链

这样的:

    function x () {
    };

    x.prototype.s = function () {
        alert("234234");
    }
    
    var x1 = new x();
    var x2 = new x();
    x1.s();

于 2015-01-23T18:20:14.440 回答
1

正如@epascarello 所说,很难说你的问题的背景是什么。

如果 的含义x是多次返回对象,则不应立即调用它。相反,您只需要声明它:

function x () { return { j: function () { alert("234234") } } }

然后随时调用它,并调用j.

var x1 = x();
x1.j();

相反,如果您打算x只使用一次,最好立即调用它,但您也需要立即使用调用j

(function () {
    return {
        j: function () {
            alert("234234")
        }
    }
})().j();
于 2015-01-23T18:27:06.627 回答