Javascript 使用赋值反结构化交换术语在函数内部不起作用
这将按照预期交换a和b的价值; 但是,如果将它放在函数中,它就不起作用了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
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我补充道,为了证明赋值解构确实可以在函数中完成,但必须使用返回值。标题似乎是它特有的。