Roa*_*ter 2 javascript revealing-module-pattern
我最近在我的Javascript中使用了Revealing Module模式来帮助构建我的代码并且一切都很顺利.但是,我对此代码片段感到有点困惑:
function vm() {
var pub = function () {
alert("from pub: " + this);
pri();
},
pri = function () {
alert("from pri: " + this);
};
return {
pub: pub,
pri: pri
};
}
var it = new vm();
it.pub();
it.pri();
Run Code Online (Sandbox Code Playgroud)
当我打电话pub()和pri()直接,this是指当前实例vm.但是,当我pri()从内部调用时pub()突然this又恢复了引用全局窗口对象.我认为揭示模块模式的目标之一是删除问题this但似乎从另一个函数中调用函数时我失去了它的价值this.
有没有人知道为什么这样,如果有一种方法让这个工作,而不必传递对当前对象的引用?
您的示例结合了调用函数的四种方法中的三种.
var it = new vm();
Run Code Online (Sandbox Code Playgroud)
在里面function vm,this指的是你要返回的对象实例.这是预料之中的.
it.pub();
Run Code Online (Sandbox Code Playgroud)
在里面function pub,这指的是与引用相同的对象实例it.再次,这是预期的.
pri();
Run Code Online (Sandbox Code Playgroud)
里面function pri,this指的是全局对象.这不是预期的,并且被认为是JavaScript语言中的错误.使用方法调用模式调用'pub'函数,因此很自然地假设在其中使用this时应始终指向当前函数/对象.
补救的办法是你的返回对象存储在虚拟机方法中的局部变量,然后由于作用域,pub和pri方法将能够安全地引用对象实例.
function vm() {
var pub = function () {
alert("from pub: " + that);
pri();
},
pri = function () {
alert("from pri: " + that);
};
var that = {
pub: pub,
pri: pri
};
return that;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2285 次 |
| 最近记录: |