【问题标题】:How can i change the value of a variable inside a function in node.js?如何更改 node.js 中函数内变量的值?
【发布时间】:2021-05-18 18:56:02
【问题描述】:

我正在尝试使用函数来更改节点 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 吗?谢谢。

【问题讨论】:

  • 您在 change_string 函数中更改了变量 new_string。而你的 console.log 是函数 main 中的变量 new_string。

标签: javascript node.js variables scope return-value


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2014-03-19
    • 2016-07-22
    相关资源
    最近更新 更多