如何在 node.js 中更改函数内变量的值?

How can i change the value of a variable inside a function in node.js?

我正在尝试使用一个函数来更改节点 js 中变量的值。我正在使用的恰好是异步函数,但我在常规(非异步)函数中也有相同的行为。

代码是

async function change_string(new_string){

new_string='goodbye';

}

async function main() {
    var new_string; 
    new_string='hello';
await change_string(new_string);
console.log(new_string);

}

main();

我希望控制台记录“再见”,但它正在记录“你好”。关于 javscript 函数的工作方式,一定有一些我不明白的地方。我需要特别 return new_string 吗?谢谢。

首先,您要问的是所谓的“副作用编程”,您在其中调用函数并更改函数外部的一些变量。出于各种充分的原因,这通常不是一种好的编程方式。而且,如果您与异步操作一起执行此操作,那么这通常是一场灾难,因为函数外部的事物何时发生变化以及其他人何时可以使用新值的时间是完全未知且不可预测的。所以,我的第一个建议是“不要这样编程”。

函数应该 return 调用者可以使用的值或承诺。或者,您可以创建一个带有方法的对象,而这些方法可以修改该特定对象的状态。

如果您有异步操作,那么您应该 return 承诺,以便调用者知道异步操作何时完成或出错。如果异步操作有一个“最终结果”,它应该是你承诺的解决值 return。

而且,我希望您意识到这些函数都不需要 async,因为它们不包含任何异步操作。

然后,最后,当您将字符串作为参数传递给函数时,函数更改了该字符串,它只是更改了参数,不会更改您传递的原始变量。这就是 Javascript 将字符串或任何原语作为函数参数传递的方式。


如果您要创建一个副作用函数,那么您需要声明它将在某个更高范围内更改的变量,以便此函数和其他任何想要使用该变量的人都可以访问它。这是一个例子:

let new_string = "";

async function change_string(){
    new_string = 'goodbye';
}

async function main() {
    new_string='hello';
    await change_string();
    console.log(new_string);
}

main();

我之所以这样编码,是因为这正是您想要做的。这不是编写任何此类代码的好方法。由于这是一组补充代码,我不知道您要解决的实际问题是什么,因此我们无法提供解决该问题的好方法。


我更愿意看到你创建一个函数来 return 修改后的字符串(并删除不必要的 async 指定):

// return modified string
function change_string(existing_string){
    return 'goodbye ' + existing_string;
}

function main() {
    let my_string = 'hello';
    let new_string = change_string(my_string);
    console.log(new_string);
}

main();