一、Let ,const、var的区别
相同点: 都是用来定义变量的
不同点:
1)、声明提升:var会声明提升,let和const不会
2)、let和const必须先定义后使用,不具备声明提升,不能重复定义
// 提前调用 预解析
console.log(int1);//undefined
// // 提前调用 结果是报错
console.log(int2);
// var 定义的变量
var int1 = 100;
let int2 = 200;
//2. 不能重复定义
// var 定义的变量
var int1 = 100;
let int2 = 200;
// 变量名称重复 重复赋值效果
var int1 = '北京';
console.log(int1);
// 变量名称重复 结果是报错
let int2 = '上海'
3)、块级作用域
// 在 {} 中 使用 let 定义变量 只能在 { } 中 使用
// 如果需要在 { } 中 对 let 定义的变量 进行操作
// 提前定义 变量 在 {} 中 进行赋值操作
if (true) {
var a = 300;
let b = 400;
// let 声明的变量 在 { } 中可以调用
// 对 {} 外定义的变量 进行赋值操作
console.log(b);
}
console.log("a", a);//300
// let 声明的变量 在 { } 外 不能调用
console.log("b", b);//报错
4)、暂时性死区:var没有,let和const有
6)、const定义的变量是常量,必须赋初始值而且不可修改,变量名一般大写
// const 定义的变量 不能重复赋值
const c = 100 ;
c = 200 ;
// 结果是报错
const NUM = [1, 2, 3, 4, 5];
// 赋值的是地址,可以修改元素
NUM[0] = '哈哈';//只是修改引用数据类型中,存储的数据
console.log(NUM);// ['哈哈', 2, 3, 4, 5]
//不能重新再赋地址,会报错
// NUM = [2];
//console.log(NUM);
二、call, apply,bind的区别
相同点: 三个函数都会改变this的指向
不同点:
1)、bind会产生新的函数,产生新的函数,新的函数里的this就是绑定对象。
2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。
3)、call和apply的区别:
第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数,可以接收父函数的arguments)。
call第二个参数朝后的所有参数是原函数的参数(把apply第二个参数展开)
//call和apply 1、改变this指向。2、调用函数本身;3、第一个参数都是对象(this的指向)
var fn01 = function(){
console.log("fn01的this",this);
}
fn01();
let obj1 = {
id:"01001"
}
fn01.call(obj1);//调用fn01的同时,让fn01内部的this是obj1
// bind:作用:1、改变this指向(把函数和对象绑死),2、产生新的函数,新的函数里的this就是绑定对象,不会调用原函数;
let obj2 = {
id: "01005"
}
let newFn05 = (function () {
console.log("匿名函数使用bind里的this", this);
}).bind(obj5);
newFn05();