箭头函数this问题
发布于 8 年前 作者 oyosc 11086 次浏览 来自 问答

var b = { c:10, fn:() => {this.c} } console.log(b.fn()); 为什么这里显示undefined的呢,有点搞不明白

38 回复

箭头函数的this是定义时绑定,普通函数是运行时绑定。

var b = {
c:10,
fn() {return this.c}
}

还有一个问题。如果是想让箭头函数默认返回,那就不要加大括号。。。。

()=>{10}  //undefined
()=>10    //10

@alanyang 一样显示undefined

@oyosc 这个时候返回的不是这个object,是windows对象

@baka397 可以解释下吗?

看1楼链接里的文章,说得很清楚

@oyosc

他的例子相当于这样 和我们讨论的箭头函数没什么关系。。
var b = {
  c: 10,
  fn: function(){console.log(this.c)}
}

@gjc9620 例子是这样,但是如果我们使用箭头函数的话就获取不到这个this.c的值了

@oyosc 我觉得核心还是那句话:函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
把你的代码换个写法。

var b = {
  c: 10
}
b.fn = ()=> {return this.c}
b.fn()

我是怎么理解的,箭头函数依然是定义在module范围内的,只是赋值给了b.fn。所以this.c 拿到到会是module的this.c。 Ps:就像 alanyang说的,你如果要fn返回this.c,那么要么去掉{}, 要么在里面加入return。

@raymonife 额,你有测试过吗?一样的是undefined,原因是箭头函数暂时不能用作对象方法

@oyosc 我只是改写了你的代码,以便解释为什么是undefined,返回确实会依然是undefined。

@raymonife 好吧,不过我问的是undefined的原因,这个不是什么函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象引起的问题。这样的回答等于没说,实际原因是箭头函数暂时不能用作对象方法

@i5ting @oyosc 哈哈, 我也想说这篇文章, 说的真的很好.

@m1jkey 你是个识货的主,哈哈,我给的文章估计人家都没看

@i5ting 哈哈, 夸奖了, 可能都是英文的原因吧

楼主的问题其实就是箭头函数用没用花括号的问题 用花括号表示执行此语句 不用则表示执行并返回 跟箭头函数this的绑定问题无关 over

@chemdemo 不用花括号照样返回 undefined 啊

@chemdemo 同意。花括号只是2L指出的一个附加错误…和this无关!楼下都跑偏啦!

1L的帖子(虽然是我写的哈哈)大概说了下原因, 2L也说的很清楚啦。 记住箭头函数是this定义时,function定义是运行时!

不知道你能不能区分运行时和定义时

运行时可能比较明了 因为传统教程都有。this指向运行时调用该函数的对象。

定义时比如说你用ES6定义一个class的时候 里面不管你在哪里写arrow function 定义也好 闭包里使用也好 多层闭包也好 this都指向这个class构建的对象!

因为手机编辑 写不了代码 还有问题的等我用电脑写下示范代码

来自酷炫的 CNodeMD

@i5ting 那篇文章有BUG,打开以后里面的代码显示不出来…

一天没看这么多人回复,我这个问题原因是箭头函数暂时不能用作对象方法,大哥们,箭头函数是this定义时,function定义是运行时并不是这个问题的原因

@Dongss 好评!

@chemdemo 楼主这个第二个如果是在webstorm上也是undefined的,因为this不指向windows,简单来说就是箭头函数暂时不能用作对象方法,无关乎其他

@Kaijun 对象里面不可以

一般情况来说 “谁”调用某函数,则某函数的this对象则就是“谁”(call、apply例外) arrow function 则是根据该函数在“谁”的作用域里,则this就是“谁”

结个贴,这个问题是箭头函数暂时不能用作对象方法,跟其他的无关,有疑问的可以自己去测试下,或者可以去看看网上的代码,只要是对象里的方法,箭头函数都是嵌套在别的函数里面的!!!

这样结了一个贴,以后还有千千万万个贴 在node命令行下执行这行代码看看

var c = 123; var b = { c:10, fn:() => this.c }; console.log(b.fn());

{270E6F6D-9187-4213-BB82-316F7D4C5A31}.bmp 这是测试截图,我觉得这个可以加精下,好多人都不知道!

@ayiis 一样是undefined,看我前面的测试截图

@oyosc 因为在node脚本里面的 this 指向空对象而不是 GLOBAL

所以, 得不到正确的this.a

@ayiis 一样是undefined的呢,唉,不说了,测试说明一切

@ayiis 这个没问题,主要是你发的那个对象里的箭头函数是指向全局,而不是b这个对象

this指向exports,群主把var a = 2;换成exports.a=2;

@oyosc 嗯,刚才误导了,其实你的问题的就是1楼回答的问题。后面的回复是针对“不能使用箭头函数做对象方法”这个结论。 还是建议你在chrome console或者在命令行下执行js代码,在node里this是很容易搞混的,特别是用了箭头函数的时候

@geemo 这个只是附加出现的,主要问题不是这个,后面跑偏了

@ayiis 哈哈,这个确实

回到顶部