问一个 ES6 作用域的问题

2020-04-01 15:13:49 +08:00
 jingcoco
var value = 1;

var foo = {
  value: 2,
  bar: function () {
    return this.value;
  }
}

//示例 1
console.log(foo.bar());
//示例 2
console.log((foo.bar)());

为什么这两个结果一样.老感觉第二个结果是 value=1 这个

3328 次点击
所在节点    JavaScript
35 条回复
morethansean
2020-04-01 17:19:45 +08:00
@Hoshinokozo #20
我感觉楼主说得够清楚了吧,主要还是没弄清楚 `(1, foo.bar)()` 和 `(foo.bar)()` 的区别。楼下的解释也蛮好的。
Hoshinokozo
2020-04-01 17:28:58 +08:00
@morethansean 额,还是没看懂。。。盲猜楼主是没搞懂括号的作用吗?(foo.bar)()和(foo.bar())效果是一样的,JS 里括号的作用无非就是调用函数和提升优先级,并且将括号内的内容作为表达式解析,两种情况最终都是调用 bar 函数,作为 foo 的成员函数,this 自然指向 foo 了。
onfuns
2020-04-01 17:37:53 +08:00
简单理解,谁调用则 this 就指向谁,console.log((foo.bar)())这里的(foo.bar)是对 foo.bar 没有计算过,也就是这个()其实是无效的等同于 foo.bar
otakustay
2020-04-01 18:37:42 +08:00
和 ES6 没关系,()运算符里面只有一个东西的时候,相当于不存在
jingcoco
2020-04-01 19:17:57 +08:00
@wunonglin @TabGre 嗯,我说错了.重新说一下
```
const obj = {
name: 'Jerry',
greet: ()=>( {
console.log(this.name)
})
}
obj.greet.call(obj) // 箭头函数的话因为没有 this 所以 call 调用无用
```
cxe2v
2020-04-01 19:46:57 +08:00
@jingcoco 箭头函数的 this 永远指向定义这个函数时它的外部环境的 this 指向的对象且不能再背更改,你这里写的 this 指向了 window,window 没有 name 属性,所以会返回空字符串
zhengjian
2020-04-01 19:47:54 +08:00
@weikexin 第三问应该是 javascript 的语句是有返回值的,在 Console 里执行语句返回的 undefined 或其他 就是语句的返回值。赋值表达式的返回值就是赋给的值。

(foo.bar = foo.bar)()

相当于

var bar = (foo.bar = foo.bar)
bar()

也就相当于

var bar = foo.bar
bar()

this 指向 window


(foo.bar = foo.bar)() -> 10
之后,再
foo.bar() -> 20
TabGre
2020-04-01 20:40:42 +08:00
@jingcoco 箭头不是没有 this,箭头函数就绑定了词法时的 this,本来是 this 是调用时决定,箭头函数在词法时就决定了
hyy1995
2020-04-01 20:54:56 +08:00
这种题…一般来说,都是自己编个想法来骗自己…
loading
2020-04-01 21:23:44 +08:00
es6 居然会看到 var 。
jingcoco
2020-04-02 04:49:00 +08:00
@TabGre 你说的有道理吧。。。。但是没看懂。。。从你的用词感觉是从逻辑的层次或是编译器的角度上去讲的?
TabGre
2020-04-02 06:20:34 +08:00
@jingcoco 推荐看 You don’t know JS yet
rodjl
2020-04-02 08:27:02 +08:00
zhzbql
2020-04-02 10:55:05 +08:00
关键词 Reference , Reference.base ; GetValue; [[call]], thisArgument; [[ThisMode]]
ssshooter
2020-04-02 11:14:06 +08:00
@Hoshinokozo 这样理解确实可以
括号只用于改变优先级没有其他任何功能,至于(false|| foo.bar)()又是 1 是`||`的锅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658321

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX