Javascript 学习JS并对何时使用return语句感到困惑

Javascript 学习JS并对何时使用return语句感到困惑,javascript,return,Javascript,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);

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

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;
}
或者,我是不是想得太多了

提前谢谢

[…]使用return和将所需内容放入变量之间有什么区别吗

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

test2
之所以“起作用”,是因为
message
在全局范围内,这在任何地方都可用。爱因斯坦将这种行为称为“远处的诡异行为”,这使得代码更难推理,例如,“这个变量发生了变化——如何?为什么?在哪里?在什么情况下?”所有这些都变得更难回答


使用
return
语句并将值修改集中并包含在尽可能小的范围内,可以更轻松地对正在发生的事情进行推理。

避免全局变量,例如示例中的“message”,是一种更干净的编程方法

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

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

考虑一下这个(干净的方法):


这与范围有关。您提供的第一个示例之所以有效,是因为缺少
消息
的作用域。如果按原来的方式定义消息,它将继承全局窗口对象,因此每个人和所有人都可以访问它:

function notSoPrivate(){
    message = 'test';
}

console.log(message); // logs 'test'
但是,如果在变量声明的前面加上单词
var
,它会将变量的作用域局限于它所在的对象/函数:

function morePrivate(){
    var message = 'test';   
}

console.log(message); // logs undefined
这允许您在函数中执行多个操作,而不会污染全局
窗口
对象,这是高度推荐的

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

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
function test2(a, b, c) {
  return {
    message1: a + b,
    message2: b + c,
    message3: a + c
  };
}

希望这有帮助

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

test2("this one used ", "a variable")
; oh? where did message come from all of a sudden?
alert(message);
  • 在使用返回值时,更容易理解代码的作用
  • 要在变量中返回一个值,它必须是全局的,并且应该尽量减少全局变量的使用
当您使用变量进行输出时,您需要知道函数将值放置在何处,以便能够遵循代码。只要查看调用函数的代码,就不会提示函数和输出之间存在关系:

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);
var o = test2("See how ", "I control where ", "it goes");
alert(o.message2);

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

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
function test2(a, b, c) {
  return {
    message1: a + b,
    message2: b + c,
    message3: a + c
  };
}
您仍然需要知道对象包含什么才能使用返回值,但至少可以清楚地看到输出是如何传递的:

var message = test2("this one used ", "a variable")
alert(message);
var o = test2("See how ", "I control where ", "it goes");
alert(o.message2);

首选第一种解决方案而非第二种解决方案的主要原因是可维护性:如果您有多个函数写入/附加到同一全局变量,那么您只是在自找不一致的麻烦。您无法从函数中获得多方面的好处。它设置了多个全局变量。如果你想要多个东西,你应该返回一个散列。像这样操纵全局变量是个坏主意,因为你可能会进入竞争条件。你只能
返回一个值,但该值可能是封装其他值的类型(对象/数组);爱爱因斯坦的参考文献。我使用了很多globals,但我同意——如果你能避免的话,请远离它们。