var b = { c:10, fn:() => {this.c} } console.log(b.fn()); 为什么这里显示undefined的呢,有点搞不明白
https://cnodejs.org/topic/57266e375a26c4a841ecbf40
箭头函数的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。
b.fn
@raymonife 额,你有测试过吗?一样的是undefined,原因是箭头函数暂时不能用作对象方法
@oyosc 我只是改写了你的代码,以便解释为什么是undefined,返回确实会依然是undefined。
@raymonife 好吧,不过我问的是undefined的原因,这个不是什么函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象引起的问题。这样的回答等于没说,实际原因是箭头函数暂时不能用作对象方法
@i5ting @oyosc 哈哈, 我也想说这篇文章, 说的真的很好.
@m1jkey 你是个识货的主,哈哈,我给的文章估计人家都没看
@i5ting 哈哈, 夸奖了, 可能都是英文的原因吧
楼主的问题其实就是箭头函数用没用花括号的问题 用花括号表示执行此语句 不用则表示执行并返回 跟箭头函数this的绑定问题无关 over
http://dongss.cn/posts/3.html#补充
@chemdemo 不用花括号照样返回 undefined 啊
@chemdemo 同意。花括号只是2L指出的一个附加错误…和this无关!楼下都跑偏啦!
1L的帖子(虽然是我写的哈哈)大概说了下原因, 2L也说的很清楚啦。 记住箭头函数是this定义时,function定义是运行时!
不知道你能不能区分运行时和定义时
运行时可能比较明了 因为传统教程都有。this指向运行时调用该函数的对象。
定义时比如说你用ES6定义一个class的时候 里面不管你在哪里写arrow function 定义也好 闭包里使用也好 多层闭包也好 this都指向这个class构建的对象!
因为手机编辑 写不了代码 还有问题的等我用电脑写下示范代码
来自酷炫的 CNodeMD
@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的呢,唉,不说了,测试说明一切
@oyosc http://www.cnblogs.com/Wayou/p/all-this.html
@ayiis 这个没问题,主要是你发的那个对象里的箭头函数是指向全局,而不是b这个对象
this指向exports,群主把var a = 2;换成exports.a=2;
@oyosc 嗯,刚才误导了,其实你的问题的就是1楼回答的问题。后面的回复是针对“不能使用箭头函数做对象方法”这个结论。 还是建议你在chrome console或者在命令行下执行js代码,在node里this是很容易搞混的,特别是用了箭头函数的时候
@geemo 这个只是附加出现的,主要问题不是这个,后面跑偏了
@ayiis 哈哈,这个确实
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
https://cnodejs.org/topic/57266e375a26c4a841ecbf40
箭头函数的this是定义时绑定,普通函数是运行时绑定。
还有一个问题。如果是想让箭头函数默认返回,那就不要加大括号。。。。
@alanyang 一样显示undefined
@oyosc 这个时候返回的不是这个object,是windows对象
@baka397 可以解释下吗?
看1楼链接里的文章,说得很清楚
@oyosc
@gjc9620 例子是这样,但是如果我们使用箭头函数的话就获取不到这个this.c的值了
@oyosc 我觉得核心还是那句话:函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
把你的代码换个写法。
我是怎么理解的,箭头函数依然是定义在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
http://dongss.cn/posts/3.html#补充
@chemdemo 不用花括号照样返回 undefined 啊
@chemdemo 同意。花括号只是2L指出的一个附加错误…和this无关!楼下都跑偏啦!
1L的帖子(虽然是我写的哈哈)大概说了下原因, 2L也说的很清楚啦。 记住箭头函数是this定义时,function定义是运行时!
不知道你能不能区分运行时和定义时
运行时可能比较明了 因为传统教程都有。this指向运行时调用该函数的对象。
定义时比如说你用ES6定义一个class的时候 里面不管你在哪里写arrow function 定义也好 闭包里使用也好 多层闭包也好 this都指向这个class构建的对象!
因为手机编辑 写不了代码 还有问题的等我用电脑写下示范代码
来自酷炫的 CNodeMD
@i5ting 那篇文章有BUG,打开以后里面的代码显示不出来…
一天没看这么多人回复,我这个问题原因是箭头函数暂时不能用作对象方法,大哥们,箭头函数是this定义时,function定义是运行时并不是这个问题的原因
@Dongss 好评!
@dd1994 看懂没
@chemdemo 楼主这个第二个如果是在webstorm上也是undefined的,因为this不指向windows,简单来说就是箭头函数暂时不能用作对象方法,无关乎其他
@Kaijun 对象里面不可以
一般情况来说 “谁”调用某函数,则某函数的this对象则就是“谁”(call、apply例外) arrow function 则是根据该函数在“谁”的作用域里,则this就是“谁”
结个贴,这个问题是箭头函数暂时不能用作对象方法,跟其他的无关,有疑问的可以自己去测试下,或者可以去看看网上的代码,只要是对象里的方法,箭头函数都是嵌套在别的函数里面的!!!
这样结了一个贴,以后还有千千万万个贴 在node命令行下执行这行代码看看
@ayiis 一样是undefined,看我前面的测试截图
@oyosc 因为在node脚本里面的 this 指向空对象而不是 GLOBAL
所以, 得不到正确的this.a
@ayiis 一样是undefined的呢,唉,不说了,测试说明一切
@oyosc http://www.cnblogs.com/Wayou/p/all-this.html
@ayiis 这个没问题,主要是你发的那个对象里的箭头函数是指向全局,而不是b这个对象
this指向exports,群主把var a = 2;换成exports.a=2;
@oyosc 嗯,刚才误导了,其实你的问题的就是1楼回答的问题。后面的回复是针对“不能使用箭头函数做对象方法”这个结论。 还是建议你在chrome console或者在命令行下执行js代码,在node里this是很容易搞混的,特别是用了箭头函数的时候
@geemo 这个只是附加出现的,主要问题不是这个,后面跑偏了
@ayiis 哈哈,这个确实