【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)赋值给一个变量。
按里面说的,该代码(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。
人人须日日改过,一旦无过可改,即一日无步可过矣。若发现不妥的点请务必指出,非常感谢。

浙公网安备 33010602011771号