Open super-fool opened 5 years ago
{ let a = 1; var b =2; } console.log(a); // a is not defined console.log(b); // 2
{ console.log(a); // a is not defined console.log(b); // 2 let a = 1; var b = 2; }
function add(x=y, y=2){ return x+y; } add(); // y is not defined
上述问题:由于x参数的默认值为y,但是y还并没有声明,所以当add函数没有传入任何参数时会报错。
let a = 1; function test1 () { console.log(a); // 1 let b = 2; } function test2 () { console.log(a); // a is not defined let a= 2; } test1(); test2();
### const的不同点 1. const必须在声明时赋值,而var和let可以只声明而不需要同时赋值。 2. const 声明一个引用类型时,可以修改内部的值, 但是**不能修改当前的引用指针地址** ### 块级作用域的优点 1. 防止内层变量覆盖外层变量:
var nowTime = new Date(); function getNowTime () { console.log(nowTime); // 获取外层变量的当前时间 if (false) { var nowTime = ""; } } getNowTime(); // 打印出来的结果:undefined
如果将`nowTime`改为使用let就可以防止变量提升。 2. 防止用来计数的循环变量泄漏到全局,这是最常见的问题了:
var arr = [1,2,3]; var fn = []; for(var i = 1; i < arr.length; i++) { fn[i] = function() { console.log(i); } } fn[1](); // 3 fn[2](); // 3 console.log(i); // 3
let\const 不属于全局变量
let\const
let a = 0; console.log(window.a); // undefined
对于声明一些配置项(接口地址,依赖包,分页器的默认页数等常量)时,我们要使用const来声明。
const
let/const与var的不同点:
function add(x=y, y=2){ return x+y; } add(); // y is not defined
let a = 1; function test1 () { console.log(a); // 1 let b = 2; } function test2 () { console.log(a); // a is not defined let a= 2; } test1(); test2();
var nowTime = new Date(); function getNowTime () { console.log(nowTime); // 获取外层变量的当前时间 if (false) { var nowTime = ""; } } getNowTime(); // 打印出来的结果:undefined
var arr = [1,2,3]; var fn = []; for(var i = 1; i < arr.length; i++) { fn[i] = function() { console.log(i); } } fn[1](); // 3 fn[2](); // 3 console.log(i); // 3