分别执行上面的两个函数,F1
不会报错,F2
报错提示变量重复。
如果函数的参数a
是以let a
的形式声明的,那么函数体内无论是var a
还是let a
都应该是重复声明变量的啊,难道不是都应该会报错的吗?为什么只有F1
报错呢?
求大神指导~
分别执行上面的两个函数,F1
不会报错,F2
报错提示变量重复。
如果函数的参数a
是以let a
的形式声明的,那么函数体内无论是var a
还是let a
都应该是重复声明变量的啊,难道不是都应该会报错的吗?为什么只有F1
报错呢?
求大神指导~
首先,function() 这个()里的a是一个私有常量。区别于下面被定义的 a (如 var a);
其次,我说的可能不太专业,var可以重新定义一个变量,而let不行。(如 var x = 1;var x = 3;但是你不能let x = 1;let x = 3;块级中,let只能一次。)
最后,我给你分析下你的函数 执行 流程: var window.a = 123;
let window.a = 123;//window.a已经被定义,所以报错。
function F1(a){
var a=123;
}
function F2(a){
let a=123;
}
F1(1);
F2(1);
JS中函数声明参数在运行时会自动创建一个函数体内的变量,var声明的变量允许重复声明,而let声明的变量是不允许重复声明的,这里面包括通过var声明的变量不能通过let再次声明,通过let声明的变量,var再次声明也是不允许的,let声明的也是如此
let p1=1;
var p1=10;//Uncaught SyntaxError: Identifier 'p1' has already been declared
var p2=1;
let p2=10;//Uncaught SyntaxError: Identifier 'p2' has already been declared
let p3=1;
let p3=10;//Uncaught SyntaxError: Identifier 'p3' has already been declared
我觉得这个问题,有3点:
1.函数作用域
2.函数参数属于局部变量
3.let 不能重复申明
其实和函数F(1)无关
function F2(a){
let a =456;
}
F2(1)
单单这个函数你就报错了,原因是:函数的参数是属于局部变量,作用域和let 申明的变量 是一样的 ,let 不允许在同一个作用域下重复声明,所以就报这个错啊,var是可以重复声明的
其实这也得出一个结论:函数的参数是js 内部声明过的,其实就和js的默认参数一样的道理
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
首先说
“如果函数的参数a是以let a的形式声明的,” 这里你传递的参数并没有通过let声明;
再说
就算你传递的参数是通过let声明的,声明是在这个函数执行的作用域外,也不影响函数内部的let声明;
之所有前面不报错是因为参数本质上就是函数内部的一个var 声明对象,所以再次var 声明覆盖是没有问题的。
let声明则不允许覆盖前面的同名声明