这个关键字在object literal的嵌套函数中

时间:2015-08-07 14:16:58

标签: javascript

var c = {
    name: 'The c object',
    log: function() {

        console.log(this);

}

在此示例中,this关键字指向包含对象“c”    c.log()返回Object {name: "The c object", log: function}

 var c = {
    name: 'The c object',
    log: function() {

        this.name = 'Updated c object';
        console.log(this);

}

在这里我们可以看到这仍然指向c对象    c.log()返回Object {name: "Updated c object", log: function}

但是在以下代码中:

    var c = {
        name: 'The c object',
        log: function() {
            this.name = 'Updated c object';
            console.log(this);

            var setname = function(newname) {
                this.name = newname;   
            }
            setname('Updated again! The c object');
            console.log(this);
      }
 }

如果我们输入c.log(),而不是将名称设置为“再次更新!c对象”,它会在窗口中创建一个具有相同属性的对象。

我遇到的具体问题是:第一个this关键字位于函数内但未指向全局对象,为什么this函数中的setname关键字指向全球对象?

1 个答案:

答案 0 :(得分:6)

  

在此示例中,此关键字指向包含对象“c”

不,它没有。 this在函数调用之前不会指向任何位置,其值取决于如何调用它,而不是取决于它的定义位置。

  

这里我们可以看到这仍然指向c对象,因为c.log()返回Object {name:“Updated c object”,log:function}

它指向c,因为您致电c.log()。它是在c

的背景下调用的
  

如果我们输入c.log(),而不是将名称设置为“再次更新!c对象”,它会在窗口中创建一个具有相同属性的对象。

您正在呼叫setname('Updated again! The c object');。没有上下文(nothing_here.setname),没有new关键字,没有callapply方法,并且您没有处于严格模式。因此,它在默认对象的上下文中调用,在浏览器上下文中,它是window