【发布时间】:2016-09-27 03:45:15
【问题描述】:
function outerFunction(x){
return function(y){
x=x+1;
console.log(x+y);
}
}
var myVal = new Number(2); //myVal is an object
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2}
var innerFunction = outerFunction(myVal); //I'm passing myVal obj
innerFunction(10) //13
innerFunction(10) //14
innerFunction(10) //15
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2} instead of 5?
我预计最后一个console.log 会打印Number{[[PrimitiveValue]]: 5},因为我将myVal object 传递给outerFunction 并且在JS 对象中是通过引用传递的,为什么它没有打印5?
【问题讨论】:
-
Re:“在 JS 中的对象是通过引用传递的”:这不是真的(正如您的代码所演示的那样)。
-
@ruakh 我将代码更改为 var myObj = {a:2} 并将 myObj 传递给外部函数..并且 x.a = x.a +1 ;并且 console.log 确实更改为 {a:5} 确认对象是通过引用传递的
-
@ruakh 对象作为引用的副本传递,因此您必须区分突变和重新分配
-
@WildWidow:这不是“通过引用传递”的意思。是的,只有一个对象(不像在 C++ 中,函数会获取对象的副本);但变量本身是不同的。 (不要难过;这实际上是一个非常常见的混淆来源。)
-
(在 C++ 术语中:在 JavaScript 中,您只有一个指向每个对象的隐式指针;无法直接引用对象,也无法获取显式指针。因此该函数具有distinct 指向 same 对象的指针。它类似于 pass-by-reference,直到您尝试重新分配局部变量并发现这只具有局部效果。)跨度>
标签: javascript closures pass-by-reference