可能有些东西我不明白。我有一个功能:
function doSmth(counter) {
counter++
console.log(counter);
doSmthElse(counter)
console.log(counter);
}
function doSmthElse(counter) {
counter = counter * 10
}
doSmth(30)
因为我认为第二个console.log中的结果应该是310,但它是31.为什么内部函数没有改变值?
答案 0 :(得分:4)
在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.
}
答案 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
函数范围内的计数器。