Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么是';这';与函数对象一起使用时,处理方式是否不同?_Javascript_Properties_This - Fatal编程技术网

Javascript 为什么是';这';与函数对象一起使用时,处理方式是否不同?

Javascript 为什么是';这';与函数对象一起使用时,处理方式是否不同?,javascript,properties,this,Javascript,Properties,This,在试图理解JavaScript中的“this”关键字时,我查阅了许多参考资料,包括关于这个流行的堆栈溢出问题的答案: 我不知道我是否误解了什么,但我读到的所有内容似乎都不完整,缺少一条规则: 尽管函数是对象,但函数对象与其他对象对“这”的处理方式不同 考虑以下代码: var object = {}; object.name = "object"; object.logMyName = function() { console.log(this.name); }; object.logMy

在试图理解JavaScript中的“this”关键字时,我查阅了许多参考资料,包括关于这个流行的堆栈溢出问题的答案:

我不知道我是否误解了什么,但我读到的所有内容似乎都不完整,缺少一条规则: 尽管函数是对象,但函数对象与其他对象对“这”的处理方式不同

考虑以下代码:

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有只读属性。不幸的是,它在无声中失败了。