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
关键字指向全球对象?
答案 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
关键字,没有call
或apply
方法,并且您没有处于严格模式。因此,它在默认对象的上下文中调用,在浏览器上下文中,它是window
。