可能有些我不了解的东西。我有一个功能:

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中,作为参数传递给函数的数字将作为值而不是引用进行传递。

这意味着,当使用counterdoSmthElse传递给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/

10-11 12:58