在JS中理解这个对象

时间:2016-06-23 14:42:47

标签: javascript

我是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();

3 个答案:

答案 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;
}