在我自己对解释用 JSON 编写的代码的 JavaScript VM的回答中,我指出不能在“私有”函数中访问 JavaScript 闭包的“公共”属性。
该帖子中给出的示例是
function anobject(){
var privatefunction = function(){
//publicfunction(); //wrong; you have no access to it
console.log(this); //refer to the global object, not the object creating
};
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
我认为原因是某些向后兼容性问题privatefunction
必须属于全局对象。所以 public 函数只是一个匿名函数,它分配给 的属性this
。这解释了为什么调用publicfunction
会失败,因为它需要this
首先引用。
但是,以下修复仍然无效:
function anobject(){
var privatefunction = function(){
//publicfunction(); //wrong; you have no access to it
console.log(this); //refer to the object creating
}.bind(this);
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
正如我明确指定privatefunction
应该与创建的对象绑定一样,调用publicfunction
应该可以工作,但不能。我必须执行以下操作:
function anobject(){
var privatefunction = function(){
this.publicfunction();
console.log(this); //refer to the object creating
}.bind(this);
this.publicfunction = function(){
console.log(this); //refer to the object creating
}
}
另一个解决方法(我使用的方式)如下:
function anobject(){
var privatefunction = function(){
publicfunction();
console.log(this); //refer to the object creating
};
var publicfunction = function(){
console.log(this); //refer to the object creating
}
this.publicfunction = publicfunction;
}
现在是问题部分。这种行为背后的原因是什么?this
通过在没有明确说明的情况下禁用 access 的属性来试图避免什么?
更新:问题的主要部分是:当解释器在范围链中找不到名称时,为什么不应该查看this
属性?