gpt4 book ai didi

javascript - 为什么我需要使用 'this' 来访问映射中的值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:16 25 4
gpt4 key购买 nike

考虑这段代码:

hello 函数中,我使用了 this.msg。这很好用。但是,如果我不使用 this,它会给出一个 msg unfined 错误。为什么 JavaScript 令人困惑,而在许多其他 OO 语言中 this 仅用于使代码对读者明确?

var smallMap = {
msg: "Hellow ",
hello: function(name) {
console.log(this.msg + name);
}
};

最佳答案

"Why is JavaScript confused,"

不是。它有一组特定的规则来管理如何访问对象属性。只是这些规则与其他所有 OO 语言都不一样。

"in many other OO languages this is used only to make code explicit to the reader"

在某些 OO 语言中,例如 Java,this 有时 只是用来使代码对读者明确,但实际上它不是完全可选的 - 它需要来区分实例变量(成员)和其他同名变量(例如,方法中的局部变量)。

JavaScript 是面向对象的,但它没有类,也没有像 Java 等其他面向对象语言那样的成员方法。在 JavaScript 中,函数是一种对象,一般来说,任何变量或对象属性都可以设置为引用任何函数 - 所以即使你在对象字面量中定义了一个函数,就像函数不是 owned< 的问题一样/em> 由有问题的对象。一个例子:

function test1() {
alert('test1');
}
var obj1 = {
prop1 : 'obj1',
method1 : test1,
method2 : function() {
alert(this.prop1);
}
}
var test2 = obj1.method2;

obj1.method1(); // alerts 'test1'
test1(); // alerts 'test1'
obj1.method2(); // alerts 'obj1'
test2(); // alerts undefined (probably; see note below)
test2.call({prop1 : 'test2'}); // alerts 'test2'
delete obj1.method2; // remove the property
alert(obj1.method2); // alerts undefined - property no longer exists
test2.call({prop1 : 'test2'}); // alerts 'test2' - the function still exists

请注意,obj1.method1 引用了一个在字面量之外定义的函数,该函数可以通过 test1() 直接调用。类似地,test2 已被设置为引用已在文字中定义但可以直接调用的函数 - 即使您实际上删除了 method2 属性,您仍然可以调用test2() 直接。

我定义了 method2/test2 以便它使用 this.prop1this 的值根据调用函数的方式设置。如果您使用“点”表示法调用它,例如 obj1.method2(),那么在函数中 this 将是点之前的对象。如果你像 test2() 那样直接调用函数,那么在非严格模式下 this 将是 window,但在严格模式下可能是未定义的或其他一些值 - 请参阅 MDN更多细节。或者您可以使用 .call() 调用函数或 .apply()并将 this 显式设置为其他对象,如上例所示。

关于javascript - 为什么我需要使用 'this' 来访问映射中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499175/

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