gpt4 book ai didi

javascript - 为什么不能在闭包的私有(private)函数中直接访问 this 的属性?

转载 作者:行者123 更新时间:2023-11-29 09:55:12 24 4
gpt4 key购买 nike

在我自己对 A JavaScript VM that interprets code written in JSON 的回答中我声明了不能在“私有(private)”函数中访问 JavaScript 闭包的“公共(public)”属性。

那个帖子中给出的例子是

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 应该与创建的对象绑定(bind)一样,调用 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 的属性,它试图避免什么?

更新:问题的主要部分是:当解释器在范围链中找不到名称时,为什么不查看 this 属性?

最佳答案

这里的问题是引用this是由函数/方法的调用者决定的,例如:

function anobject(){
// here "this" is the object
var privatefunction = function(){
// here "this" is the object **that called privatefunction()**
};
this.publicfunction = function(){
// this method will always be called by the object, so "this" is the object
}
}

要达到你想要的效果,你也可以试试这个:

function anobject(){
var that = this;
var privatefunction = function(){
[do what you like using "that"]
};
this.publicfunction = function(){
[here you can use "this" directly, or "that"]
}
}

另请参阅 javascript 作用域的工作原理,此处 What is the scope of variables in JavaScript?和网络上。

关于javascript - 为什么不能在闭包的私有(private)函数中直接访问 this 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com