【发布时间】:2018-08-24 00:25:41
【问题描述】:
这些天我在 node 中做一些编程,我对函数中范围的处理感到有点惊讶。我被引导相信现在使用 ES6 范围要严格得多。以下按预期工作:
function f(v){
v += 1;
return v;
}
let before = 1;
let after = f(before);
console.log(after); // This logs 2 (as expected)
console.log(before); // This logs 1 (as expected)
但是当我使用对象/字典做同样的事情时,变量的范围似乎超出了函数:
function f(v){
v.a += 1;
return v;
}
let before = {a: 1};
let after = f(before);
console.log(after.a); // This logs 2 (as expected)
console.log(before.a); // This also logs 2 (I was expecting this to still be 1)
到底为什么会这样?为什么v的作用域是int时只限于函数,而当它是对象时则不是?
【问题讨论】:
-
这似乎是原始数据类型与对象的情况。类似的事情会在 Java 中发生 ints vs. Strings
-
在 JS 中,只有字符串和数字是通过值传递的,其他的都是通过引用/指针传递的。它与 ES6 无关。
-
@t.niese 类似的东西。不复制对象。但是被复制的是对这些对象的引用。所以,
before和after是不同的引用,但它们具有相同的 value:对象本身的地址。 -
@FisNaN 如果您使用术语 reference 和 pointer,则需要小心。通过引用传递在 js 中并不真正存在,至少在
function test(a) { a = {foo:1} } test(b); console.log(b.foo)可以工作的意义上不存在。 -
@Zlatko 是的,我知道。但我没有时间(或者说老实说动机)用正确的术语写一个答案。 :) 至此,这只是一个评论。但是您的回答很好地说明了这一点。
标签: javascript node.js ecmascript-6 scope