function test(a, b){
a = a + 2;
b = b + 5;
}
var a = 1;
var b = 2;
test(a, b);
console.log(a);
console.log(b);
这返回 1 和 2,但我想要 3 和 7。
是否可以在一个功能中进行两个操作?如果我使用返回,这工作,但如何使用返回两个操作?
直播:http: //jsfiddle.net/anCq6/
function test(a, b){
a = a + 2;
b = b + 5;
}
var a = 1;
var b = 2;
test(a, b);
console.log(a);
console.log(b);
这返回 1 和 2,但我想要 3 和 7。
是否可以在一个功能中进行两个操作?如果我使用返回,这工作,但如何使用返回两个操作?
直播:http: //jsfiddle.net/anCq6/
你得到 1 和 2 而不是 3 和 7 的原因是因为有两个不同的 a 和 b 变量。有你在函数外部声明的 a 和 b ,还有 a 和 b 代表你传递给函数的值。(基本上,函数括号中声明的参数是新声明的变量。)
如果要更改外部 a 和 b,请将测试函数更改为以下内容:
function test(x, y) {
a = x + 2;
b = y + 5;
}
或者,或者,不要将引用传递给函数,以便内部作用域中的 a 和 b 引用与外部作用域相同的 a 和 b:
function test() {
a = a + 2;
b = b + 5;
}
只需将其作为对象发送回来...
function test(a, b){
a = a + 2;
b = b + 5;
return {a:a,b:b};
}
var a = 1;
var b = 2;
var test = test(a, b);
alert(test.a);
alert(test.b);
这不起作用,因为由于数字是通过值而不是通过引用传递的,因此您正在修改这些变量的本地副本,但是外部范围内的那些保持不变。
如果从函数中删除 a 和 b 参数,您将获得所需的行为,因为正在修改的 a 和 b 参数将是外部范围内的参数。
什么是参考?
这是一个相当不错的答案 - Javascript by reference vs. by value
简而言之,只有对象和数组是通过引用传递的。尽管实际上它比这更复杂,具体取决于函数的定义方式和语法,但此时您可以假设通过调用new
或语法简写[]
(array) 和{}
(object) 定义的任何内容都是通过引用传递的。其他类型如数字和字符串是按值传递的。
另一种解决方案:由于 JavaScript 中变量作用域的工作方式,您只需删除“test”函数的参数即可。
function test(){
a = a + 2;
b = b + 5;
}
function test(){
a = a + 2;
b = b + 5;
}
var a = 1;
var b = 2;
test();
console.log(a);
console.log(b);