首页 新闻 会员 周边 捐助

JS中 一个关于this指向的问题

0
[已解决问题] 解决于 2018-03-13 16:31

看了一些关于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

实在想不出来了  唯一能想到的就是语法本身就不对?

三松屋老板的主页 三松屋老板 | 菜鸟二级 | 园豆:204
提问于:2017-11-27 18:24
< >
分享
最佳答案
0

第一个问题:

第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)}

希望对你有帮助

 

奖励园豆:5
我只是慕名而来 | 菜鸟二级 |园豆:303 | 2017-12-13 13:45
其他回答(4)
0

你首先要学习一下 { foo:foo } 第一个 foo 和第二个 foo 的区别。emm

长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-28 09:33

我觉得不是这个问题   如果你会  能不能说明一下问题2

支持(0) 反对(0) 三松屋老板 | 园豆:204 (菜鸟二级) | 2017-11-28 15:39

@三松屋老板: 你可以在代码之间插入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)
支持(0) 反对(0) 长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-28 15:45

@长蘑菇星人: 感谢 大概知道怎么回事了  那能不能简单解释下 为什么foo:console.log(this)在定义对象的时候就执行了呢?

支持(0) 反对(0) 三松屋老板 | 园豆:204 (菜鸟二级) | 2017-11-28 16:01
0

foo:foo这里的第二个foo是一个函数foo,foo:foo()这里的foo()是指函数foo执行后的结果

夜如此安静 | 园豆:212 (菜鸟二级) | 2017-12-07 09:33
0

同意楼上。

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。

木筏乏乏乏 | 园豆:202 (菜鸟二级) | 2018-01-09 18:30
0

这里不全是js的this指向的问题,在js里面,  函数名称,是一个变量foo,这个变量后面加上 () 就是调用,也就是说,函数名称后面跟上(),就是立即执行,所以,foo:foo()  指的就是 foo函数执行后的结果,而foo又没有return,所以就是undefined。另外楼上说的this指向是非常正确的

muamaker | 园豆:763 (小虾三级) | 2018-01-13 16:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册