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,这两个变量都指向内存中的同一地址,这是因为它将为函数范围创建一个新的环境记录,该记录几乎复制了这些值。参考:注意编辑函数内的对象,因为它会影响使用此对象的其他函数-->通过传递值消除,因此它显然是更好的选项