gpt4 book ai didi

javascript - JS 命名空间范围 : "this" inside "var" function evaluates to "window"

转载 作者:行者123 更新时间:2023-12-03 07:06:36 25 4
gpt4 key购买 nike

我有一个带有一些公共(public)方法和一些私有(private)方法的类。公共(public)方法绑定(bind)到“this”,私有(private)方法使用“var”。

我从类外部调用公共(public)方法“do()”,并且“this”的计算结果为“MyClass”。但是,如果我进一步调用私有(private)“something()”方法,则“this”的计算结果为全局命名空间“Window”;

function MyClass() {
// private field
var keys = ["foo", "bar"];

// public method
this.method = function(key) {
alert(key);
}

// private method
var something = function() {
console.log("something()");
console.log(this);
$.each(keys, function(idx, key){
this.method(key);
}.bind(this));
}

// public method
this.do = function() {
console.log("do()");
console.log(this);
something();
}
}

var test = new MyClass();
test.do();

上面的代码作为 fiddle :https://jsfiddle.net/lilalinux/13m242ce/8/

据我了解, this.do (在构造函数内部分配)是一个“特权”函数,因此应该可以从类外部调用,并允许访问私有(private)成员(即变量和参数)构造函数)。

最佳答案

由于 something 不直接与 MyClass 关联,因此它的 this 值不会引用您的 MyClass 实例。您应该做的是在 something 之外分配对 this 的引用,并在您的私有(private)函数中引用该变量。

类似这样的事情:

function MyClass() {
var self = this; // <-- keep the reference

// ...

// private method
var something = function() {
console.log("something()");
console.log(self);
$.each(keys, function(idx, key){
self.method(key);
}.bind(self));
}

// ...
}

关于javascript - JS 命名空间范围 : "this" inside "var" function evaluates to "window",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36799726/

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