为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
Why does the scope changes while implementing Lazy function inside module pattern in javascript?
方法1:
正常中的工作代码
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();
输出:
第一次
初始化-仅一次[对象窗口]
每次初始化后执行(初始化不应再次执行)[对象窗口]
每隔一次
每次初始化后执行(初始化不应再次执行)[对象窗口]
方法2
im正在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();
输出:
第一次
初始化-仅一次[对象对象]
每次初始化后执行(初始化不应再次执行)[对象窗口]
每隔一次
初始化-仅一次[对象对象]
每次初始化后执行(初始化不应再次执行)[对象窗口]
为什么foo1在方法2中再次初始化
为什么在方法2中,模块模式内部的范围更改为窗口
如何使方法2像方法1一样工作
请从概念上解释方法2的错误。提前谢谢
您可以看到以下行:
initialise - one time only[object Object]
Executes everytime after initialising(initialise should not execute again) [object Window]
在CCD_ 1的每次调用中,因为对初始CCD_;所以你没有执行:
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
};
})();
相关文章:
- 正在全局范围中查找JavaScript函数
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 可以't访问JavaScript函数范围中的变量
- 在 Angular 指令中,如何进行回调,其中函数名称位于父范围的变量中
- 我怎样才能创建一个函数expr;t继承词法范围
- 获取给定JavaScript范围内的解析函数
- 为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
- 如何在JavaScript中使用此函数对范围内的所有数字求和
- 构造函数函数中的自执行函数的OO上下文/范围
- javascript和jQuery的嵌套对象函数中的变量范围
- 对象内部函数内的对象文本的范围
- JavaScript 函数变量范围问题
- 如何触发指令中定义的范围函数
- 范围函数角度的右设置
- 角度控制器范围项作为范围函数的子项
- 在 Angular 指令中的事件处理程序中调用范围函数
- Angular JS 如何从指令模板内容事件调用指令范围函数
- 如何使用混合参数调用父级的范围函数
- 如何从带有参数的指令中调用角度控制器范围函数
- 为什么我的范围函数显示一个未定义的值后,循环应该已经关闭