企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[segmentfault](https://segmentfault.com/q/1010000003912929/a-1020000003913024) ``` var x = 10; var foo = { x: 20, bar: function () { var x = 30; return this.x; } }; console.log( foo.bar(), // 20. (foo.bar)(), // 20. (foo.bar = foo.bar)(), // 10. (foo.bar, foo.bar)() // 10. ); ``` 这题考的主要知识点是同名变量覆盖和上下文`this`的问题。 `(foo.bar)()`这个是取得表达式`foo.bar`的值,然后执行它,和`foo.bar()`是一样的。 `(foo.bar = foo.bar)()`这个就有意思了,它是把`foo.bar`赋给`foo.bar`,感觉好像啥都没做是不是?但就是因为这个赋值语句,让`bar`方法脱离了它原本的上下文`foo`,变成了一个全局函数。因为JS中赋值语句是有副作用的,除了赋值,还会把这个值返回。 实际上这句代码相当于: ~~~ var temp = (foo.bar = foo.bar); temp(); ~~~ 这时候的`temp`指向`foo.bar`,但此时的`this`却不再是`foo`,而是全局对象(`window`)。因为全局变量相当于`window`的属性,所以返回的是全局变量`x`的值`10`。 `(foo.bar, foo.bar)()`这个同理,逗号运算符会依次执行每个子表达式,并返回最右的那个子表达式的值。