0

方法一:

正常工作代码

var foo1 = function() {
    var t1 = new Date();
    console.log("initialise - one time only "+this);
    foo1 = function() {
        console.log("Executes everytime after initialising(initialise should not execute again) "+this);
        return t1;
    };
    return foo1();
};

执行: foo1();

输出:

第一次

初始化 - 仅一次 [对象窗口]

每次初始化后执行(初始化不应再次执行)[对象窗口]

每隔一段时间

每次初始化后执行(初始化不应再次执行)[对象窗口]

方法二

我在 javascript 的模块中尝试相同的方法

var tt=(function(){
     var foo = function() {
        var that=this;
        var t = new Date();
        console.log("initialise - one time only" + this);
        foo = function() {
            console.log("Executes everytime after initialising(initialise should not execute again) "+this);
            return t;
        };
        return foo();
    }
    return {
        foo:foo
    };
})();

执行:tt.foo();

输出:

第一次

初始化 - 仅一次[object Object]

每次初始化后执行(初始化不应再次执行)[对象窗口]

每隔一段时间

初始化 - 仅一次[object Object]

每次初始化后执行(初始化不应再次执行)[对象窗口]

为什么 foo1 在方法 2 中再次初始化?

为什么在方法 2 中,模块模式内部的 this 范围会更改为 window ?

如何使方法 2 像方法 1 一样工作?

请给出一个概念解释方法 2 有什么问题。提前致谢。

4

1 回答 1

2

您会看到以下几行:

initialise - one time only[object Object]
Executes everytime after initialising(initialise should not execute again) [object Window]

在每次调用中,tt.foo()因为对初始foo值的引用保存在返回对象中 ({ foo: foo }); 所以你没有执行:

foo = function() {
    console.log("Executes everytime after initialising(initialise should not execute again) "+this);
    return t;
};

但你正在执行:

function () {
    var that=this;
    var t = new Date();
    console.log("initialise - one time only" + this);
    foo = function() {
        console.log("Executes everytime after initialising(initialise should not execute again) "+this);
        return t;
    };
    return foo();
}

第一个日志是initialise - one time only[object Object]因为您正在使用以下上下文调用该方法:

{ foo: foo }

这就像打电话:

var a = {
   test: function () {
      console.log(this);
   }
}

这里将记录a对象。在第二个 console.log 中,匿名对象 ( ) 未引用 foo ,{ foo: foo }因此使用上下文调用它window- 类似于: foo.apply(window)。我希望我的解释很清楚。

编辑 要使第二种方法像第一种方法一样工作,您必须foo在一开始就有正确的参考。下面的代码正在解决这个问题:

var tt=(function(){
     var foo = (function() {
        var that=this;
        var t = new Date();
        console.log("initialise - one time only" + this);
        foo = function() {
            console.log("Executes everytime after initialising(initialise should not execute again) "+this);
            return t;
        };
        return foo;
    }());
    return {
        foo:foo
    };
})();
于 2012-08-27T07:59:05.057 回答