我刚刚学习了函数,我对在函数中使用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;
}
或者,我只是在想这个/错了吗?
提前致谢。
答案 0 :(得分:2)
[...]使用return和将我需要的内容放在变量中是否有任何区别?
是
如果使用全局变量,例如,函数中未使用var
声明的变量,则将在全局范围中创建该变量。这意味着您可能会意外覆盖具有相同名称的变量,并且可能导致所有排序难以诊断的错误。全球范围通常是一件坏事。
test2
"工作"因为message
在全球范围内,所以在任何地方都可以使用。爱因斯坦会把这个"幽灵般的动作称为远距离",这使得代码更难以推理,例如,#34;这个变量已经改变了 - 如何?为什么?哪里?在什么情况下?"一切都变得更难回答。
使用return
语句并保留值修改集中变更的位置并包含在最小范围内可以更容易地推断出发生的事情。
答案 1 :(得分:0)
避免使用全局变量(例如示例中的“message”)是一种更清晰的编程方法。
使用函数返回值可以显示多个不同的消息而没有“副作用”。
在这种情况下,副作用是变量'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));
答案 2 :(得分:0)
关于范围。您提供的第一个示例的原因是因为缺少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
希望这有帮助!
答案 3 :(得分:0)
使用返回值和使用变量输出之间主要有两个区别:
当您使用变量进行输出时,您需要知道函数将值放在何处以便能够遵循代码。只看一下调用函数的代码就不会暗示函数和输出之间存在关系:
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);