团队第九周作业
1. let和var有什么区别?
1.1 分析区别
不能重复声明一个变量
拥有块级作用域
不存在变量提升
1.2 分析代码剖析原因
1.2.1
function sayHi(){
console.log(name);
console.log(age);
var name = 'Lily';
let age = 21;
}
sayHi()
A. Lily 和 undefined
B. Lily 和 ReferenceError
C. ReferenceError 和 21
D. undefined 和 ReferenceError
答案是什么?并解释一下为什么
d, var 存在变量提升,所以执行顺序为
var name;
console.log(name);
name = "Lily";
而let不存在,就打印时没有name这个变量
1.2.2
var name = 'Matt';
console.log(window.name);
let age = 26;
console.log(window.age);
Matt 和undefined
var不存在块级作用域,所以就直接name就是window全局的
let存在块级作用域,所以window.age 与age就不是一个东西,而属性如果没有赋值就会返回undefined
1.2.3
for (var i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i);
for (let i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i);
5 5
这两个i应该都是之前var定义的全局的i,var不存在块级作用域,所以定义的i是全局的,然后let有块级作用域,出了for就不生效。假如将第二个for中5改为4,也不会对结果造成影响。
1.2.4
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
5个5 和 0 到4
setTimeout()是异步任务
第一个循环,每次定义一个计时器,而这个计时器是一个全局的变量,当i发生改变的时候,这个setTimeout里面的i值也会改变,到最后一次执行++i,i=5,退出循环时执行5次console.log(i) i = 5;
第二个循环,let有块级作用域,不会被下一次i的改变而影响到,所以就是从1到4
2. 箭头函数
2.1 箭头函数有哪些特点?
this
是静态的,始终指向声明时的作用域,无法改变。- 不能用
argument
变量。
2.2 分析代码
const shape = {
radius: 10,
diameter() {
return this.radius * 2;
},
perimeter: () => 2 * Math.PI * this.radius
};
console.log(shape.diameter());
console.log(shape.perimeter());
20 NaN
箭头函数中this.radius是未定义的,因为箭头函数中this是静态的,指向perimeter,而perimeter中不存在radius属性
3.请用代码解释解构赋值
数组
const score = [90, 100, 95];
let [math, English, Chinese] = score;
这个不是很常用
对象
const student = {
name: "",
score: 100,
gotoschool: function(){
console.log("1");
}
}
let {gotoschool} = student;
//或者let {name, score, gotoschool} = student;
gotoschool();