学习JS并困惑何时使用返回语句

Learning JS and confused about when to use return statements

本文关键字:返回 语句 何时使 JS 学习      更新时间:2023-09-26

我刚刚学习完函数,我对在函数中使用 return 语句和变量有点困惑。

function test1(frag1, frag2) {
    return frag1 + frag2;
}
function test2(frag1, frag2) {
    message = frag1 + frag2;
}
alert(test1("this one used", " a return"));
test2("this one used ", "a variable")
alert(message);

除了在警报之外调用 test2 之外,使用 return 和将我需要的东西放在变量中有什么区别吗?我了解到要从函数中获取数据,我必须使用 return 语句。那么test2是如何工作的呢?

你只能使用 return 从函数中获取一件事,对吧?那么,我可以使用test2来获取多个内容吗?喜欢这个:

function test2(a, b, c) {
  message1 = a + b;
  message2 = b + c;
  message3 = a + c;
}

或者,我只是想太多了/只是错了?

提前谢谢。

[...]使用返回和将我需要的东西放在变量中有什么区别吗?

是的。

如果使用全局变量,例如,未在函数中使用var声明的变量,则该变量将在全局范围内创建。这意味着您可能会意外覆盖具有相同名称的变量,并可能导致各种难以诊断的错误。全球范围通常是一件坏事。

test2"有效"message因为它在全球范围内,随处可见。爱因斯坦会称之为"远距离的幽灵动作",这使得代码更难推理,例如,"这个变量已经改变了——怎么改变?为什么?哪里?在什么情况下?"都变得更加难以回答。

使用return语句并将值修改更改的位置集中保存在尽可能小的范围内,可以更轻松地推理正在发生的事情。

避免全局变量(例如示例中的"消息"(是一种更简洁的编程方法。

使用函数返回值可以显示多个不同的消息,而不会产生"副作用"。

在这种情况下,副作用是变量"message"只能保存一条消息并在任何给定时间显示它。

考虑一下(干净的方法(:

function sqr(n) {
    return n * n;
}
function msg1() {
    return "Hello 1";
}
function addIt(n1, n2) {
    return n1 + n2;
}
alert(sqr(5));
alert(msg1());
alert(addIt(5, 5));

它关于范围。您提供的第一个示例起作用的原因是因为缺乏message的范围。如果你像以前一样定义消息,它会继承全局窗口对象,因此每个人都可以访问:

function notSoPrivate(){
    message = 'test';
}
console.log(message); // logs 'test'

但是,如果您在变量的声明前面加上单词 var ,它会在本地将其范围限定为它所在的对象/函数:

function morePrivate(){
    var message = 'test';   
}
console.log(message); // logs undefined

这允许您在函数中执行多个操作,而不会污染全局window对象,强烈建议这样做。

如果要返回多个项目,可以返回一个数组:

function test2(a, b, c) {
    var message1 = a + b,
        message2 = b + c,
        message3 = a + c;
    return [message1,message2,message3];
}
console.log(test2(1,2,3)[0]); // logs 3

或者我的首选选项,一个对象:

function test2(a, b, c) {
    var m1 = a + b,
        m2 = b + c,
        m3 = a + c;
    return {
        message1:m1,
        message2:m2,
        message3:m3
    };
}
console.log(test2(1,2,3).message1); // logs 3

希望这有所帮助!

使用返回值和使用变量进行输出之间主要有两个区别:

  • 使用返回值时,遵循代码的作用要容易得多。
  • 要返回变量中的值,它必须是全局的,并且您应该尝试将全局变量的使用保持在最低限度。

当您使用变量进行输出时,您需要知道函数将值放在哪里才能遵循代码。仅查看调用函数的代码并不能提示函数和输出之间存在关系:

test2("this one used ", "a variable")
; oh? where did message come from all of a sudden?
alert(message);

当你使用返回值时,很明显该值来自函数,所以查看代码会告诉你所有你需要知道的关于输出是如何传递的:

var message = test2("this one used ", "a variable")
alert(message);

如果要从函数返回多个值,可以使用数组或对象:

function test2(a, b, c) {
  return {
    message1: a + b,
    message2: b + c,
    message3: a + c
  };
}

您仍然需要知道对象包含什么才能使用返回值,但至少输出是如何传递的清晰可见的:

var o = test2("See how ", "I control where ", "it goes");
alert(o.message2);