看了一些关于this指向的帖子 对帖子上的问题进行了改进 于是用帖子的方法回答不出来了
function foo() { console.log(this) } var obj = { a: 2, foo:foo }; obj.foo()
这是帖子上的原题 我理解是 foo:foo 就是把foo函数赋值给obj的foo方法 所以obj调用方法的时候 this就指向自身了 于是我就想 如果我把题改成
function foo() { console.log(this) } var obj = { a: 2, foo:foo() }; obj.foo
执行结果是不是一样呢?然后经过我的分析 我认为 这个代码段是等价于下面的
var obj = { a: 2, foo:console.log(this) }; obj.foo
问题1 第2个代码段 是不是等价于第3个代码段 这个想法有没有问题
问题2 第2 第3个代码段 console出来的结果 为什么this会指向window
实在想不出来了 唯一能想到的就是语法本身就不对?
第一个问题:
第2个代码段不等价与第三个代码段,这样的想法是不对的
第二个问题:
先解释一下为什么都是指向window,
第2个代码段中你在foo后面加上了括号,有括号和没有括号是有区别的,加上括号的意思就是执行这个foo方法,所以代码中:foo:foo()的意思就是把foo()方法执行后的结果给foo
第3个代码段中的:foo:console.log(this)的意思是直接把console.log(this)执行的结果赋值个foo
最后说一下this的指向问题(重点):
js中的this指向是:谁调用就指向谁
如果你单纯的调用foo()这个方法,那么this就是指向window,
如果是这个:foo:foo;的话,那么你使用了obj.foo()之后,this就是指向当前这个调用对象obj,类型也就是object。
其实foo:foo的意思就是把foo这个方法的方法体给obj中的foo,等价于foo:function(){console.log(this)}
希望对你有帮助
你首先要学习一下 { foo:foo } 第一个 foo 和第二个 foo 的区别。emm
我觉得不是这个问题 如果你会 能不能说明一下问题2
@三松屋老板: 你可以在代码之间插入log 看看调用时机
function foo() {
console.log(this)
}
var obj = {
a: 2,
foo:foo
};
console.log(1)
obj.foo()
console.log(2)
var obj = {
a: 2,
foo:console.log(this)
};
console.log(1)
obj.foo
console.log(2)
@长蘑菇星人: 感谢 大概知道怎么回事了 那能不能简单解释下 为什么foo:console.log(this)在定义对象的时候就执行了呢?
foo:foo
这里的第二个foo是一个函数foo,foo:foo()这里的foo()是指函数foo执行后的结果
同意楼上。
js里的this指向是 谁调用就指向谁。
单纯执行foo(),this的指向就是指向window。而obj.foo(),this就指向obj。
第1个代码里,obj.foo(),obj调用的foo(),所以this指向obj,打印出来就是obj对象。
第2个代码里,obj.foo,是foo()函数,单纯执行,this指向window,打印出window。
第3个代码里,obj.foo,是console.log(this)语句,执行,this当然是指向window的,打印出window。
这里不全是js的this指向的问题,在js里面, 函数名称,是一个变量foo,这个变量后面加上 () 就是调用,也就是说,函数名称后面跟上(),就是立即执行,所以,foo:foo() 指的就是 foo函数执行后的结果,而foo又没有return,所以就是undefined。另外楼上说的this指向是非常正确的