JavaScript函数体内的变量声明问题

牛头人丨酋长
  • 49

图片描述

分别执行上面的两个函数,F1不会报错,F2报错提示变量重复。
如果函数的参数a是以let a的形式声明的,那么函数体内无论是var a还是let a都应该是重复声明变量的啊,难道不是都应该会报错的吗?为什么只有F1报错呢?
求大神指导~

回复
阅读 2.1k
6 个回答
✓ 已被采纳

首先说
“如果函数的参数a是以let a的形式声明的,” 这里你传递的参数并没有通过let声明;
再说
就算你传递的参数是通过let声明的,声明是在这个函数执行的作用域外,也不影响函数内部的let声明;

之所有前面不报错是因为参数本质上就是函数内部的一个var 声明对象,所以再次var 声明覆盖是没有问题的。
let声明则不允许覆盖前面的同名声明

用let声明变量:在相同的函数或块作用域内重新声明同一个变量会引发SyntaxError;而var不会。
这是let与var在声明变量方面的一个区别之一。

首先,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的默认参数一样的道理

你知道吗?

宣传栏