可能有些我不了解的东西。我有一个功能:
function doSmth(counter) {
counter++
console.log(counter);
doSmthElse(counter)
console.log(counter);
}
function doSmthElse(counter) {
counter = counter * 10
}
doSmth(30)
如我以为第二个console.log中的结果应该是310,但它是31。为什么内部函数没有更改值?
最佳答案
在javascript中,作为参数传递给函数的数字将作为值而不是引用进行传递。
这意味着,当使用counter
将doSmthElse
传递给doSmthElse(counter)
函数时,将复制counter
变量并将其传递给doSmthElse
。
在doSmthElse
实现中,当您执行counter = counter * 10
时,它是您修改的计数器的副本,而不是原始计数器。
解决问题的一种简单方法是return
更新后的值并将其分配回去:
function doSmth(counter) {
counter = doSmthElse(counter);
}
function doSmthElse(counter) {
return counter * 10;
}
请注意,如果传递的是对象而不是数字,则不会有问题,因为对象是引用类型。
doSmthElse
传递的是指向对象的指针:它表示实际对象,而不是其副本:function doSmth() {
doSmthElse(obj);
console.log(obj.counter); // counter has been multiplied by 10
}
function doSmthElse(obj) {
obj.counter = obj.counter * 10; // this works: we can modify the object
// that "obj" refers to.
obj = null // this has no effect outside of the current function: it
// simply modifies what the variable "obj" refers to in the
// current function.
}
关于javascript - 内部功能的变量变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44603958/