var b = { c:10, fn:() => {this.c} } console.log(b.fn()); 为什么这里显示undefined的呢,有点搞不明白
箭头函数的this是定义时绑定,普通函数是运行时绑定。
var b = {
c:10,
fn() {return this.c}
}
还有一个问题。如果是想让箭头函数默认返回,那就不要加大括号。。。。
()=>{10} //undefined
()=>10 //10
@alanyang 一样显示undefined
@oyosc 这个时候返回的不是这个object,是windows对象
@baka397 可以解释下吗?
看1楼链接里的文章,说得很清楚
他的例子相当于这样 和我们讨论的箭头函数没什么关系。。
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对象,就是定义时所在的对象,而不是使用时所在的对象引起的问题。这样的回答等于没说,实际原因是箭头函数暂时不能用作对象方法
@m1jkey 你是个识货的主,哈哈,我给的文章估计人家都没看
@i5ting 哈哈, 夸奖了, 可能都是英文的原因吧
楼主的问题其实就是箭头函数用没用花括号的问题 用花括号表示执行此语句 不用则表示执行并返回 跟箭头函数this的绑定问题无关 over
@chemdemo 不用花括号照样返回 undefined 啊
@i5ting 那篇文章有BUG,打开以后里面的代码显示不出来…
一天没看这么多人回复,我这个问题原因是箭头函数暂时不能用作对象方法,大哥们,箭头函数是this定义时,function定义是运行时并不是这个问题的原因
@Dongss 好评!
@dd1994 看懂没
@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());
这是测试截图,我觉得这个可以加精下,好多人都不知道!
@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 哈哈,这个确实