我是JS的新手,像其他新手一样努力理解JS中THIS关键字的概念。在下面的代码片段名称更改为value1,我知道,因为它的c对象是调用日志函数。
但是无法理解为什么setName函数无法更改name变量的值?
var c ={
name:"value",
log:function(){
this.name="Value 1";
console.log(this.name); // c object is invoking log function hence this refers to c obj
var setName= function(newName){
this.name=newName;
}
setName('Value 2'); // isn't log function calling setName
console.log(this.name);
}
}
c.log();
答案 0 :(得分:1)
this
的值取决于function
的调用方式。
setName
没有c
对象的上下文,它具有global(window)
上下文。使用Function#bind
指定context
。
var c = {
name: "value",
log: function() {
this.name = "Value 1";
console.log(this.name);
var setName = function(newName) {
this.name = newName;
}.bind(this);
setName('Value 2');
console.log(this.name);
}
};
c.log();

答案 1 :(得分:1)
这一行:
var setName= function(newName){
this.name=newName;
}
不需要引用upper函数,因为你对它的调用是直接的,而且dunction不是upper函数的直接成员,比如:this.setName = function().... 所以它将引用一个新的背景。
要更改上面的那个,你必须为它做另一个参考,而不是使用它,如:
var upperThis = this;
var setName= function(newName){
upperThis.name=newName;
}
答案 2 :(得分:0)
函数setName创建一个新的上下文,因此它创建一个新的this
。
这样就可以了:
var that = this;
var setName= function(newName){
that.name=newName;
}