Javascript JS将整个对象传递给函数需要更多内存

Javascript JS将整个对象传递给函数需要更多内存,javascript,Javascript,今天我了解到,如果我有一个对象: var foo = {a: 1, b: { ... }} 我把它传递给一个函数: function test(foo) { foo.b } 它必须将整个foo对象加载到函数的作用域中才能访问 b属性,它增加了内存消耗 书中的建议是始终只传递您需要的信息: function test(b) { b } test(foo.b) 我的问题是这是真的吗?为什么?对象是通过引用传递的 它必须将整个foo对象加载到函数的作用域中才能访问b属性,这会增加

今天我了解到,如果我有一个对象:

var foo = {a: 1, b: { ... }}
我把它传递给一个函数:

function test(foo) {
  foo.b
}
它必须将整个
foo
对象加载到函数的作用域中才能访问
b
属性,它增加了内存消耗

书中的建议是始终只传递您需要的信息:

function test(b) {
   b
 }

 test(foo.b)
我的问题是这是真的吗?为什么?对象是通过引用传递的

它必须将整个foo对象加载到函数的作用域中才能访问b属性,这会增加内存消耗

这是错误的。正如你所说

对象是通过引用传递的

因此,在这两种情况下,都会传递一个引用,这将消耗相同的内存(如果确实如此)

书中的建议是永远只传递你需要的东西

这是清洁设计的良好实践

不,这是证据

const foo = {a: 1, b: 'bar'}

function printB(obj){
    console.log(obj.b)
    setTimeout(() =>console.log(obj.b),1000)
}

// pitfall changing a object inside a function
function editB(obj){
    obj.b = `I'm just writing something to an object`
}

printB(foo)
// prints bar
editB(foo)
// after one second it prints 'I'm just writing something to an object'

将对象传递给函数时,创建的变量引用传递的对象,而不是对象地址本身。所以在一个函数中,如果你像这样给它赋值,
foo={}
它不会影响传递的对象,你只改变了作用域变量的引用。但是我可以改变对象属性。是的,因为你的变量指向原始对象。因此,您有两个变量
foo
,它们是原始变量,为函数生成的一个变量指向originalAnd,这两个变量都指向内存中的同一地址,这是因为它将为函数范围创建一个新的环境记录,该记录几乎复制了这些值。参考:注意编辑函数内的对象,因为它会影响使用此对象的其他函数-->通过传递值消除,因此它显然是更好的选项