let 和 const
- 函数赋值
function bar(x =y, y = 2) {
return [x, y];
}
bar(); // 报错
function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2] 函数括号内部可以看成一个作用域,变量由let声明,从左向右 执行。
2.为什么需要块级作用域
- 防止内层变量覆盖外层变量:块级作用域中 var 的声明会发生变量提升。
- 防止循环变量内存泄漏;
- 立即函数执行表达式不需要了;
3.能否在块级作用中声明函数?
- es5中不能 只能在顶层和函数中声明;
- es6中满足以下三点要求:
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 同时,函数声明还会提升到所在的块级作用域的头部
- 允许在块级作用域内声明函数。(只在大括号使用时成立)
function f() {
console.log('I am outside!');
}
(function () {
if (false) {
// 重复声明一次函数f
function f() {
console.log('I am inside!');
}
}
f();
}());
//实际执行时
function f() {
console.log('I am outside!');
}
(function () {
var f = undefined;
if (false) {
function f() {
console.log('I am inside!');
}
}
f();
}());
// Uncaught TypeError: f is not a function
- const的保证;
变量指向的内存地址不能改变=>基本类型变量不能改变,对象类型可以改变。
使得对象值不可改变的方法:Object.freeze({})
- 声明变量的六种方法
var function let const import class
- 关于变量声明与顶层对象的关系;
js的败笔:全局作用域声明的变量是顶层对象属性的赋值挂钩。
无法在编译时报变量为声明(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的)
很容易创造出全局变量。
顶层对象可读写,不利于模块化?(不理解)
let和const的创造为了与顶层变量脱钩;