内部函数的变量变化

时间:2017-06-17 11:17:42

标签: javascript variables scope

可能有些东西我不明白。我有一个功能:

function doSmth(counter) {
    counter++
    console.log(counter);
    doSmthElse(counter)
    console.log(counter);
}

function doSmthElse(counter) {
    counter = counter * 10
}
doSmth(30)

因为我认为第二个console.log中的结果应该是310,但它是31.为什么内部函数没有改变值?

3 个答案:

答案 0 :(得分:4)

在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.
}

答案 1 :(得分:1)

这只是因为变量的范围而发生。

第一步,您需要了解变量的范围以及如何使用变量。

您需要返回更新someLabel.text = constantsDict["name"]! 变量

的值

你可以这样做

counter

答案 2 :(得分:0)

在以下功能中,您正在反击doSmth功能。 counter通过值传递给doSmth函数,因为它包含原始值,例如整数,而不是变量本身。

function doSmth(counter) {
    counter++;
    console.log(counter);
    doSmthElse(counter); // <------------ passed by value
    console.log(counter);
}

同样在下面,当doSmthElse函数调用doSmth时,函数计数器再次按值传递。

function doSmthElse(counter) {
    // scope of doSmthElse starts
    counter = counter * 10;
    // counter is local to doSmthElse, it has nothing to do with doSmth's counter variable.
    // scope of doSmthElse ends
}

上面的函数进行计算,即乘以10并分配给计数器的本地副本。 由于该值在doSmthElse的词法范围内,并且在外部范围内不可用。

此外,由于doSmthElse的返回计数器值未重新分配给计数器变量,因此实际上没有任何内容更改为位于doSmth函数范围内的计数器。