如何将变量传递给函数并为其设置新值?

时间:2016-01-04 17:28:21

标签: javascript function

我发现很难解释或搜索这个问题,所以我要问Stack Overflow。

我多次要求用户在终端中输入用户信息并希望从中获取功能。一个带有问题和变量的函数,输入应该添加到变量中。

这是我的代码:

var name = 'hello',
    age = '11'

var readline = require('readline');
// var rl = readline.createInterface(process.stdin, process.stdout);
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
var getInput = function(inputVariable, question, cb) {
  rl.question(question, function(answer) {
    inputVariable = answer;
    rl.close();
    cb();
  });
}

var askForName = function() {
  console.log(1,age, name);
  getInput(name, "What's your name? ", askForAge);
}
var askForAge = function() {
  console.log(2,age, name);
  getInput(age, "How old are you? ", printIt);
}
var printIt = function() {
  console.log("Hello, " + name);
  console.log(".. and " + age + " old.");
}

askForName();

谢谢!

4 个答案:

答案 0 :(得分:1)

在node.js应用程序中,通常使用回调链或promises来解决这个问题。

使用回调,您可以像这样编写代码:

var getInput = function(question, cb) {
  rl.question(question, function(answer) {
    // Don't set the variable, but return value to callback
    rl.close();
    cb(answer);
  });
}

// ask* take a callback which they call with the value
var askForName = function(cb) {
  getInput("What's your name? ", cb);
}
var askForAge = function(cb) {
  getInput("How old are you? ", cb);
}
// printIt takes the values as parameters
var printIt = function(name, age) {
  console.log("Hello, " + name);
  console.log(".. and " + age + " old.");
}

// Now ask for name and age and store them as local variables
// inside callbacks
askForName(function(name) {
  askForAge(function(age) {
    printIt(name, age);
  });
});

我添加了评论来解释这些变化。基本上,值只在回调之间传递,从不暴露给另一个范围。

答案 1 :(得分:1)

将变量传递给函数时,将引用更改为它不会影响原始变量。您可以修改变量的属性。但是,这不应该被用作传递变量的主要方法。

从异步进程传递响应的常用方法是使用回调函数。你几乎得到了它:

var getInput = function( question, cb ) {
  rl.question(question, function(answer) {
    rl.close();
    cb(answer);
  });
}

var askForName = function( cb ) {
  getInput("What's your name? ", cb);
}
var askForAge = function( cb ) {
  getInput("How old are you? ", cb);
}
var printIt = function( name, age ) {
  console.log("Hello, " + name);
  console.log(".. and " + age + " old.");
}

askForName(function(name) {
  askForAge(function(age) {
    printIt( name, age );
  });
});

答案 2 :(得分:1)

在javascript中,只有reference传递了某些内容 - 它们是objectsarrays。所有其他原始类型(字符串,整数等)都不是。

说到这里,有很多方法可以让你在这里得到你的东西..特别是因为agename基本上是globals(至少在目前的事情范围)

一种方法是只需要getInput()方法return所需的值,然后将其分配给global var。另一种方法是为您想要更改的每个setter编写global个方法。还有其他人,但那些是最简单的......

无论如何,以下内容可以解决您的问题:

var name = 'hello',
    age = '11'

var readline = require('readline');
// var rl = readline.createInterface(process.stdin, process.stdout);
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
var getInput = function(inputVariable, question, cb) {
  rl.question(question, function(answer) {
    if( inputVariable === 'name' ) {
        name = answer;
    } else if( inputVariable === 'age' ){
        age = answer;
    }
    rl.close();
    cb();
  });
}

var askForName = function() {
  console.log(1,age, name);
  getInput('name', "What's your name? ", askForAge);
}
var askForAge = function() {
  console.log(2,age, name);
  getInput('age', "How old are you? ", printIt);
}
var printIt = function() {
  console.log("Hello, " + name);
  console.log(".. and " + age + " old.");
}

askForName();

现在,有更优雅的方式来做到这一点。例如,您可以创建map,您可以将if语句更改为switch,您可以getInput通过callback等返回字符串。

答案 3 :(得分:1)

您可以使用Object代替原始值,因为对象是通过引用传递的,这意味着原始对象的内存地址将受到影响。

在下面的示例中,通过利用对象中的该功能,我还使用了 Function.prototype.call() 方法来设置函数的执行上下文(在{{{ 1}}变量不是全局的。

answers