试图理解这个' JavaScript中的关键字,我查看了很多资源,包括这个流行的Stack Overflow问题的答案: How does the "this" keyword work?
我不知道我是否误解了某些内容,但我读过的所有内容似乎都是不完整的,并且错过了一条规则: 即使功能是对象,这个'对于函数对象与其他对象的区别对待。
请考虑以下代码:
var object = {};
object.name = "object";
object.logMyName = function() {
console.log(this.name);
};
object.logMyName();
因为在对象('对象')上调用了一个函数(' logMyName'),所以'这个'设置为调用函数(' logMyName')的对象(' object')。
现在考虑以下代码:
var funcObject = function() {};
funcObject.name = "funcObject";
funcObject.logMyName = function() {
console.log(this.name);
};
funcObject.logMyName();
虽然在一个对象(' funcObject')上调用了一个函数(' logMyName'),但这个'是不设置为调用函数(' logMyName')的对象(' funcObject')。
为什么存在这种对象类型之间的差异,为什么很少/从未讨论过它?
答案 0 :(得分:5)
那是因为函数具有特殊的name
属性。
name
属性的值是一个描述的属性的String 功能。该名称没有语义意义,但通常是一个 变量或属性名称,用于引用其中的函数 ECMAScript代码中的定义点。这家酒店有 属性{[[可写]]:错误,[[可枚举]]:错误, [[Configurable]]: true }。
该属性不可写,因此您的分配将被忽略。
但是,由于它是可配置的,您可以重新定义它:
var funcObject = function() {};
Object.defineProperty(funcObject, 'name', {
configurable: true,
value: "funcObject"
});
funcObject.logMyName = function() {
console.log(this.name);
};
funcObject.logMyName(); // logs "funcObject"
请注意,在ES6将其标准化为可配置之前,一些旧浏览器将其实现为不可配置,因此上述代码可能无效。