【JavaScript前菜】赋值表达式的副作用

问题:b = a 做了什么?

今天看《你不知道的JavaScript(上卷)》的时候看到一段让我很疑惑的代码:

 1 function foo() {
 2   console.log(this.a);
 3 }
 4 var a = 2;
 5 var o = { a: 3, foo: foo };
 6 var p = { a: 4 };
 7 
 8 // 在浏览器运行的结果
 9 o.foo();  // 3
10 (p.foo = o.foo)(); // 2

这段代码本是用来讨论’this‘的,不过我们在这聚焦在第十行代码:(p.foo = o.foo)();

看这代码矫健的身形(p.foo = o.foo)是要返回一个方法的节奏,比较后面紧接的小括号是要按照执行方法的方法去执行它。

果不其然,看较有权威的资料:

表达式是一组代码的集合,它返回一个值。(译注:定义比较不好理解,看下面的举例就很好懂了。)

每一个合法的表达式都能计算成某个值,但从概念上讲,有两种类型的表达式:有副作用的(比如赋值)和单纯计算求值的。

表达式x=7是第一类型的一个例子。该表达式使用=运算符将值7赋予变量x。这个表达式自己的值等于7。

代码3 + 4是第二个表达式类型的一个例子。该表达式使用+运算符把3和4加到一起但并没有把结果(7)赋值给一个变量。

摘自——MDN中JavaScript的表达式与运算符篇章

按里面说的,该代码(p.foo = o.foo)的主要作用是得出了一个方法,赋值反而是副作用的。

这也不管主副的,反正能敲定它确实是会返回值的。

仅根据引述材料,似乎不能说出这返回值是从p.foo出来的,还是从o.foo出来的。

简单点来说,当return b = a 时,返回值是a,还是b仍是不能确定的。

来一个例子:这个例子得益于一个优秀答主的回答

 1 function test(a) {
 2   return b.value = a;
 3 }
 4 let b = {
 5   get value() {return 1;},
 6   set value(val) {}
 7 }
 8 
 9 console.log(test(2)); // 2
10 console.log(b.value); // 1

很明显,当return b = a时,返回值是a

 

人人须日日改过,一旦无过可改,即一日无步可过矣。若发现不妥的点请务必指出,非常感谢。

posted @ 2022-01-18 23:45  不乏理想的三师弟  阅读(70)  评论(0)    收藏  举报