Javascript 如果使用var重新声明将对现有变量产生影响

Javascript 如果使用var重新声明将对现有变量产生影响,javascript,ecmascript-6,Javascript,Ecmascript 6,constshow1=函数(x,y=()=>{x=2;返回x;}){ 设x=3; console.log(y()); 控制台日志(x); }; show1()为什么show2和show3的结果不同。 让我们用这种方法评估代码 const show2 = function(x, y = () => {x.value = 2; return x;}) { x = {name: "from argument", value: 3}; console.log(y());//{nam

constshow1=函数(x,y=()=>{x=2;返回x;}){
设x=3;
console.log(y());
控制台日志(x);
};

show1()
为什么show2和show3的结果不同。

让我们用这种方法评估代码

const show2 = function(x, y = () => {x.value = 2; return x;}) {
    x = {name: "from argument", value: 3};
    console.log(y());//{name: "from argument", value: 2}
    console.log(x);//{name: "from argument", value: 2}
};
show2();

const show3 = function(x, y = () => {if(!x){x = {name:"from function", value: -1}}x.value = 2; return x;}) {
    var x = {name: "from var", value: 3};
    console.log(y());//{name: "from function", value: 2}
    console.log(x);//{name: "from var", value: 3}
};
show3();

const show4 = function(x, y = () => {if(!x){x = {name:"from function", value: -1}}x.value = 2; return x;}) {
    var x = {name: "from var", value: 3};
    console.log(y());//{name: "from outside", value: 2}
    console.log(x);//{name: "from var", value: 3}
};
show4({name:"from outside", value: -1})

为什么show2和show3的结果不同。

让我们用这种方法评估代码

const show2 = function(x, y = () => {x.value = 2; return x;}) {
    x = {name: "from argument", value: 3};
    console.log(y());//{name: "from argument", value: 2}
    console.log(x);//{name: "from argument", value: 2}
};
show2();

const show3 = function(x, y = () => {if(!x){x = {name:"from function", value: -1}}x.value = 2; return x;}) {
    var x = {name: "from var", value: 3};
    console.log(y());//{name: "from function", value: 2}
    console.log(x);//{name: "from var", value: 3}
};
show3();

const show4 = function(x, y = () => {if(!x){x = {name:"from function", value: -1}}x.value = 2; return x;}) {
    var x = {name: "from var", value: 3};
    console.log(y());//{name: "from outside", value: 2}
    console.log(x);//{name: "from var", value: 3}
};
show4({name:"from outside", value: -1})

show1
抛出错误,因为在该块中初始化了使用
let
const
声明的变量(无论是在参数列表中还是使用
const
/
let
/
var


默认参数引用的变量具有奇数范围规则。每个参数本质上都会创建另一个块,该参数名称可以在其中定义。所以

const show3 = function(x, y = () => { x = 2; return x; }) {
有点像(请原谅psuedo代码):


因此,您的
show2
正在将名为
x
的参数重新指定给函数体第一行中的3。相反,
show3
正在创建一个新的变量绑定,其名称为
x
,而
y
函数对
x
的引用正在引用参数
x
,这是不同的。

show1
抛出错误,因为在该块中用
let
const
声明的变量已初始化(无论是在参数列表中还是用
const
/
let
/
var


默认参数引用的变量具有奇数范围规则。每个参数本质上都会创建另一个块,该参数名称可以在其中定义。所以

const show3 = function(x, y = () => { x = 2; return x; }) {
有点像(请原谅psuedo代码):


因此,您的
show2
正在将名为
x
的参数重新指定给函数体第一行中的3。相比之下,
show3
正在创建一个新的变量绑定,其名称为
x
,而
y
函数对
x
的引用是引用参数
x
,这与重新声明javascript变量不同。

。重新声明对x没有任何作用,这在使用现代语法(
const
let
)时是不正确的,其他答案都没有提到这一点;如果变量名是用
const
let
声明的,则不得在其他地方初始化(例如在参数列表中,或在块的其他地方用
var
)@CertainPerformance,如show1所示。show2和show3的区别是什么?@BAKE ZQ根据重新定义javascript变量查看我的答案。重新声明对x没有任何作用,这在使用现代语法(
const
let
)时是不正确的,其他答案都没有提到这一点;如果变量名是用
const
let
声明的,则不得在其他地方初始化(例如在参数列表中,或在块的其他地方用
var
)@CertainPerformance,如show1所示。show2和show3的区别如何?@BAKE ZQ如果您的意思是此函数中没有声明
x
,请参阅我的答案。我指的是参数范围中的参数
x
?几乎是-参数列表中变量的范围与函数体中声明的变量的范围(非常轻微)不同,尽管它很少对代码有明显的影响。如果没有参数的默认值怎么办。如果此参数范围仍然存在?假设这两个范围不同,为什么我不能在这里使用
let
const
?(因为它们位于不同的块中。我可以编写类似于
{let a=0;{let a=0}}
)的代码。如果没有任何默认参数,那么如果有一个参数
x
var x=
将无法与
x=
区分开来,因为除了函数体之外,没有作用域可以单独引用参数。我确信规范描述了精确的行为,但不管它是什么,它都是不可观察的。无论出于什么原因,它只是碰巧决定了使用
let
const
声明的变量隐藏参数变量名会抛出错误(可能是因为它会导致语义混乱),即使从上面的psuedo代码来看,如果您的意思是在这个函数中没有声明
x
,这样的事情看起来也没问题。我指的是参数范围中的参数
x
?几乎是-参数列表中变量的范围与函数体中声明的变量的范围(非常轻微)不同,尽管它很少对代码有明显的影响。如果没有参数的默认值怎么办。如果此参数范围仍然存在?假设这两个范围不同,为什么我不能在这里使用
let
const
?(因为它们位于不同的块中。我可以编写类似于
{let a=0;{let a=0}}
)的代码。如果没有任何默认参数,那么如果有一个参数
x
var x=
将无法与
x=
区分开来,因为除了函数体之外,没有作用域可以单独引用参数。我确信规范描述了精确的行为,但不管它是什么,它都是不可观察的。无论出于什么原因,它只是碰巧决定了使用
let
const
声明的变量隐藏参数变量名会抛出错误(可能是因为它会导致语义混乱),即使从THX上面的psuedo代码来看,这样的事情也没问题。那我就错了。参数中只有一个
x
变量。对吗?show2中的
x
实际上是在案例2中的参数列表(或范围)中查找变量的结果。正如我