CNode

箭头函数this问题

问答
Ooyosc发布于10 年前最后回复10 年前38 回复12880 浏览0 收藏

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

查看回复

回复 (38)

G
gjc9620#1·10 年前
引用 oyosc@baka397 可以解释下吗?

@oyosc

他的例子相当于这样 和我们讨论的箭头函数没什么关系。。
var b = {
  c: 10,
  fn: function(){console.log(this.c)}
}
O
oyosc#2·10 年前
引用 gjc9620@oyosc

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

I
i5ting#3·10 年前
引用 m1jkey@i5ting @oyosc 哈哈, 我也想说这篇文章, 说的真的很好.

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

M
m1jkey#4·10 年前
引用 i5ting@m1jkey 你是个识货的主,哈哈,我给的文章估计人家都没看

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

C
chemdemo#5·10 年前

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

A
alanyang#9·10 年前

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

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

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

()=>{10}  //undefined
()=>10    //10
B
baka397#11·10 年前
引用 oyosc@alanyang 一样显示undefined

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

O
oyosc#12·10 年前
B
baka397#13·10 年前
引用 oyosc@baka397 可以解释下吗?

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

R
raymonife#14·10 年前

@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。

R
raymonife#16·10 年前
引用 oyosc@raymonife 额,你有测试过吗?一样的是undefined,原因是箭头函数暂时不能用作对象方法

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

O
oyosc#17·10 年前
引用 raymonife@oyosc 我只是改写了你的代码,以便解释为什么是undefined,返回确实会依然是undefined。

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

M
m1jkey#18·10 年前
引用 i5tinghttps://cnodejs.org/topic/57266e375a26c4a841ecbf40

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

K
Kaijun#19·10 年前
引用 chemdemo楼主的问题其实就是箭头函数用没用花括号的问题 用花括号表示执行此语句 不用则表示执行并返回 跟箭头函数this的绑定问题无关 over

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

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

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

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

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

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

来自酷炫的 CNodeMD

O
oyosc#20·10 年前
引用 i5ting@m1jkey 你是个识货的主,哈哈,我给的文章估计人家都没看

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

O
oyosc#21·10 年前

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

C
chemdemo#23·10 年前

@dd1994 看懂没 untitled2.png

O
oyosc#24·10 年前
引用 chemdemo@dd1994 看懂没

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

Y
yuanzhhh#26·10 年前

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

O
oyosc#27·10 年前

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

A
ayiis#28·10 年前

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

var c = 123; var b = { c:10, fn:() => this.c }; console.log(b.fn());
O
oyosc#29·10 年前

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

O
oyosc#30·10 年前
A
ayiis#31·10 年前
引用 oyosc@ayiis 一样是undefined,看我前面的测试截图

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

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

O
oyosc#32·10 年前
引用 ayiis@oyosc 因为在node脚本里面的 this 指向空对象而不是 GLOBAL 所以, 得不到正确的this.a

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

O
oyosc#34·10 年前
引用 ayiis@oyosc http://www.cnblogs.com/Wayou/p/all this.html

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

G
geemo#35·10 年前

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

A
ayiis#36·10 年前
引用 oyosc@ayiis 这个没问题,主要是你发的那个对象里的箭头函数是指向全局,而不是b这个对象

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

O
oyosc#37·10 年前
引用 geemothis指向exports,群主把var a = 2;换成exports.a=2;

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

参与回复
登录后即可参与回复。登录