块级声明用于声明在指定块的作用域之外无法访问的变量,块级作用域(也被称为词法作用域)存在于:
- 函数内部
- 块中(字符 { } 之间的区域)
1,let 声明
用let声明可以将变量的作用域限制在当前的代码块汇中,避免变量提升
变量提升(Hoisting)机制:在函数作用域或全局作用域中通过关键字var声明的变量,无论在哪里声明,都会当成在当前作用域顶部声明的变量
2,const声明
使用const声明的是敞亮,每个通过const声明的常量必须初始化
3,临时死区(TDZ Temporal Dead Zone)
javascript引擎在扫描代码发现变量声明时,要么将变量提升到作用域顶部,要么放在TDZ中。只有在执行过变量声明语句后,变量才会从TDZ中移出,然后方可访问
4,循环块中的作用域绑定
循环中的let声明,模仿IIFE(立即调用函数表达式)所做的一起来简化循环过程,每次迭代循环都会创建一个新的变量,并以之前迭代中同名变量的值将其初始化
例子:
var funcs = [];
for(var i=0; i<10;i++) {
funcs.push(function() {
console.log(i)
})
}
funcs.forEach(function(func){
func(); //输出10次数字10
})
在循环中使用let声明后:
var funcs = [];
for(let i=0; i<10;i++) {
funcs.push(function() {
console.log(i)
})
}
funcs.forEach(function(func){
func(); //输出0,1,2,3,4,5,6,7,8,9
})
5,在ES6中的 默认参数值
function make(url, timeout = 2000,callback = function(){}) {
//函数的其余部分
}
参数名 = 默认值 的方法给参数赋予默认值,在已经制定默认值的参数后,可以继续声明无默认值的参数
在引用参数默认值的时候,只允许引用前面参数的值,即先定义的参数能访问后定义的参数
6,ES6 中 默认参数表达式
函数的参数默认值可以传表达式
function getValue() {
return 5;
}
function add( first, second = getValue()) {
return first + second
}
console.log(add(1,1)) ; //2
console.log(add(1)) ; //6
注意:当使用函数调用结果作为默认参数值时,如果忘记小括号,例如:second = getValue,则最终传入的是对函数的引用,而不是函数的调用结果