let
命令
let
命令只在所在的代码块内有效。
{
let a = 11;
var b = 111;
}
console.log(a) // a is not defined
console.log(b) // 1
不存在变量提升
// let 声明
console.log(a);// reference error
let a = 11;
// var 声明
console.log(b);// undefined
var b = 11;
暂时性死区
var a = 11;
{
tmp = 22;// reference error 块级作用域内存在let命令,它所声明的变量就“绑定”这个区域
let a
}
不允许重复声明
// 'a' has already been declared
function fn(){
let a = 11;
var a = 1;
}
// 'a' has already been declared
function fn(){
let a = 11;
let a = 1;
}
const
命令
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const P = 100;
console.log(P) // 100
P = 200;
// TypeError: Assignment to constant variable.
const
保证变量指向内存地址不得改动
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
顶层对象属性
顶层对象的属性与全局变量是等价
window.a = 11;
console.log(a) // 11
a = 22;
console.log(window.a) // 22
let
命令、const
命令与顶层对象脱钩
var a = 11;
console.log(window.a) // 1
let b = 22;
console.log(window.b) // undefined
前端常见相关面试题型
一、与作用域相关题目;
题目1:
function fn1(){
a = 11;
}
fn1();
console.log(a);
function fn2(){
var b = 22;
}
fn2();
console.log(b);
function fn3(){
let c = 33;
}
fn3();
console.log(c)
答案1:
// 11
// b is not defined
// c is not defined
二、与for
循环相关题目
题目1:
for (var i = 0; i < 3; i++){
console.log(i)
}
console.log(i)
fot (let j = 0; j < 3; j++){
console.log(j)
}
console.log(j)
答案1:
// 0 1 2
// 3
// 0 1 2
// j is not defined
题目2:
for (let i = 0; i < 3; i++) {
let i = 'aaa';
console.log(i);
}
for (var j = 0; j < 3; j++) {
var j = 'bbb';
console.log(j);
}
答案2:
// 'aaa' 'aaa' 'aaa'
// 'bbb'
题目3:
for (var i = 0; i < 3; i++) {
let i = 'aaa';
console.log(i);
}
for (let j = 0; j < 3; j++) {
var j = 'bbb';
console.log(j);
}
答案3:
// 'aaa' 'aaa' 'aaa'
// Identifier 'j' has already been declared.
题目4:
var a = [];
for (let i = 0; i < 5; i++){
console.log(i);
a[i] = function(){
console.log(i)
}
}
a[3]();
var b = [];
for (var j = 0; j < 5; j++){
console.log(j);
b[j] =function(){
console.log(j)
}
}
b[3]();
答案4:
// 0 1 2 3 4
// 3
// 0 1 2 3 4
// 5
三、与setTimeout
相关题目
题目1:
for(var i = 0;i < 10; i++){
console.log(i);
setTimeout(function () {
console.log(i);:
},0);
}
for(let j = 0;j < 10; j++){
console.log(j);
setTimeout(function () {
console.log(j);
},0);
}
答案1:
// 0 1 2 3 4 5 6 7 8 9
// 10 10 10 10 10 10 10 10 10 10
// 0 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
四、与闭包相关题目
题目1:
for (var i = 0; i <= 5; i++) {
(function() {
setTimeout( function timer() {
console.log(i);
},i*1000 );
})();
}
for (var j = 0; j <= 5; j++) {
(function() {
var a = j;
setTimeout( function timer() {
console.log(a);
},a*1000 );
})();
}
for (var k = 0; k <= 5; k++) {
let b = k;
setTimeout(function timer() {
console.log(b);
},b*1000);
}
答案1:
// 6 6 6 6 6 6
// 0 1 2 3 4 5
// 0 1 2 3 4 5
参考文献
阮一峰老师的 ECMAScript 6 入门
点赞 评论 收藏 ~~ 今天的学习记录暂时到这...... ~~ 点赞 评论 收藏