Javascript 使用赋值反结构化交换术语在函数内部不起作用

Javascript 使用赋值反结构化交换术语在函数内部不起作用,javascript,ecmascript-6,Javascript,Ecmascript 6,这将按照预期交换a和b的价值; 但是,如果将它放在函数中,它就不起作用了 let a = 'alpha', b = 'beta'; [a,b] = [b,a]; 我在这里错过了什么?当你这样做的时候 let c = 'charlie', d = 'delta'; swapVar = (x,y) => [x,y] = [y,x] swapVar(c,d); let a = 'alpha', b = 'beta'; [a,b] = [b,a]; 您正在交换a和b的值 当你这样做的时候 l

这将按照预期交换a和b的价值; 但是,如果将它放在函数中,它就不起作用了

let a = 'alpha', b = 'beta';
[a,b] = [b,a];
我在这里错过了什么?

当你这样做的时候

let c = 'charlie', d = 'delta';
swapVar = (x,y) => [x,y] = [y,x]
swapVar(c,d);
let a = 'alpha', b = 'beta';
[a,b] = [b,a];
您正在交换
a
b
的值

当你这样做的时候

let c = 'charlie', d = 'delta';
swapVar = (x,y) => [x,y] = [y,x]
swapVar(c,d);
let a = 'alpha', b = 'beta';
[a,b] = [b,a];
因此,在函数内部,值是交换的,但不会反映在函数外部。您可以这样修改程序:

let c = 'charlie', d = 'delta';
swapVar = (x,y) => {
   // x and y are separate variables scoped within this block
   [x,y] = [y,x]
   console.log(x,y); // it is swapped alright but isn't reflected on c and d
   c = x;
   d = y; 
   // Now the value will have been reflected.
}
swapVar(c,d);

以达到预期效果。

您正在一个变量未“导出”的范围内进行交换

在第一个示例中,您对实际变量
a
b
在其定义的范围内进行操作

但是,在第二个示例中,您对变量
x
y
进行操作,这两个变量的值与
c
d
相同,但不是实际的
c
d
,因为它们是基本变量,所以箭头函数范围之外的
c
d
不会受到影响

{
设a='alpha',
b=‘β’;
控制台日志(“测试1”);
log(`beforea:${a}b:${b}`);
[a,b]=[b,a];
log(`after a:${a}b:${b}`);
}
{
设c='charlie',
d=δ;
控制台日志(“测试2”);
log(`before c:${c}d:${d}`);
swapVar=(x,y)=>[x,y]=[y,x]
/*
函数swapVarExpanded(x,y){
常数tmp=[y,x];
x=tmp[0];
y=tmp[1];
//其实没关系
//因为x和y在下一次闭合时因作用域而消失
}
*/
swapVar(c,d);
log(`after c:${c}d:${d}`);

}
我认为这些变量不同。它们的作用域仅限于arrow函数,然后死亡。您如何测试它们是否已被交换?参数是通过Javascript中的值传递的,而不是通过引用传递的。分配给函数内部的变量对调用方的变量没有影响。
swapVar
在最后一个示例中完全没有用处。最好只是
[c,d]=[d,c],额外级别的间接寻址没有任何好处,甚至没有可读性,并且实际上使函数的返回值具有误导性(因为它只是返回一个值反转的数组,而不是“交换”)@PatrickRoberts我补充道,为了证明赋值解构确实可以在函数中完成,但必须使用返回值。标题似乎是它特有的。