为什么这个javascript单例方法有效

时间:2012-06-08 06:48:47

标签: javascript

function foo() {
    if (arguments.callee.self)
        return arguments.callee.self;
    arguments.callee.self = this;
    //do sth
}

我明白这个时候会这样叫:

var a = foo();

当foo被执行时,arguments.callee本身就是foo。所以它将它传递给未定义的变量self。下次当另一个函数调用foo时,它会返回此值。显然,这将有效。

当这样调用时,事情似乎变得棘手了:

var b = new foo();

我认为js引擎创建了另一个foo实例并执行其代码。但它似乎传回了这个引用,因为self已经被定义,就像foo的同一个实例一样。 那么“新”究竟在这里做什么?

1 个答案:

答案 0 :(得分:3)

new将该函数作为构造函数调用。如果目标函数显式返回一个对象,那么将返回该对象而不是刚刚创建的对象。

由于您在非严格模式下运行此代码,因此该函数在第一次调用后显式返回全局对象,因此它不会返回带有new foo()的新创建的对象