Javascript 为什么是';这';与函数对象一起使用时,处理方式是否不同?
在试图理解JavaScript中的“this”关键字时,我查阅了许多参考资料,包括关于这个流行的堆栈溢出问题的答案: 我不知道我是否误解了什么,但我读到的所有内容似乎都不完整,缺少一条规则: 尽管函数是对象,但函数对象与其他对象对“这”的处理方式不同 考虑以下代码:Javascript 为什么是';这';与函数对象一起使用时,处理方式是否不同?,javascript,properties,this,Javascript,Properties,This,在试图理解JavaScript中的“this”关键字时,我查阅了许多参考资料,包括关于这个流行的堆栈溢出问题的答案: 我不知道我是否误解了什么,但我读到的所有内容似乎都不完整,缺少一条规则: 尽管函数是对象,但函数对象与其他对象对“这”的处理方式不同 考虑以下代码: var object = {}; object.name = "object"; object.logMyName = function() { console.log(this.name); }; object.logMy
var object = {};
object.name = "object";
object.logMyName = function() {
console.log(this.name);
};
object.logMyName();
var funcObject = function() {};
funcObject.name = "funcObject";
funcObject.logMyName = function() {
console.log(this.name);
};
funcObject.logMyName();
因为函数('logMyName')是在对象('object')上调用的,所以“this”被设置为调用函数('logMyName')的对象('object')
现在考虑下面的代码:
var object = {};
object.name = "object";
object.logMyName = function() {
console.log(this.name);
};
object.logMyName();
var funcObject = function() {};
funcObject.name = "funcObject";
funcObject.logMyName = function() {
console.log(this.name);
};
funcObject.logMyName();
虽然对对象(“funcObject”)调用了函数(“logMyName”),但“this”未设置为调用函数(“logMyName”)的对象(“funcObject”)
为什么对象类型之间存在这种差异,为什么很少/从未讨论过这种差异?这是因为函数有一个特殊的属性
name
属性的值是一个描述
功能。该名称没有语义意义,但通常是一个
变量或属性名,用于在其位置引用函数
ECMAScript代码中的定义点。此属性具有
属性{[[Writable]]:false,[[Enumerable]]:false,
[[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将其标准化为可配置之前,一些旧浏览器将其实现为不可配置,因此上面的代码可能无法工作。第二个代码示例使用匿名函数。当我将代码放入JSFIDLE时,“this.name”返回空白。name属性似乎是只读的&不能用
funcObject.name=“funcObject”设置代码>你是对的。我认为这是“this”行为的一个症状,但它似乎只是由于只读属性。我不知道JavaScript有只读属性。不幸的是,它在无声中失败了。