首页 > 解决方案 > 如何更改 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 函数的工作方式一定有一些我不明白的地方。我需要专门返回 new_string 吗?谢谢你。

标签: javascriptnode.jsvariablesscopereturn-value

解决方案


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

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

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

而且,我希望您意识到这些函数都不需要,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();

我只是这样编码,因为这是你想要做的。这不是编写任何代码的好方法。由于这是一组代码,我不知道您要解决什么真正的问题,因此我们无法提供解决该问题的好方法。


我更希望看到您创建一个返回修改后的字符串的函数(并删除不必要的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();


推荐阅读