var let const 区别
- var
提前声明变量 √
作用域: 函数 - let
重复定义 ×
提前声明变量 ×
作用域:块级
暂时性死区 √ : 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError 封闭作用域。凡是在声明之前就使用这些变量,就会报错。
let tmp;
tmp = 123; //123
}
- const
暂时性死区 √
重复定义 ×
提前声明变量 ×
修改×
作用域:块级
一般函数 箭头函数 区别
箭头函数是匿名函数,不能new,不能作为构造函数
- 参数
箭头函数不绑定arguments,取而代之用rest参数…解决
function f(a){
console.log(arguments); //10
}
f(10);
var cfun=(...c)>{ //...c即为rest参数
console.log(c); //5
}
cfun(5);
- this指向
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this作为自己的 this 值,任何方法都改变不了其指向,如call(), bind(), apply()
普通函数的this指向调用它的那个对象
声明式 function fun(){} this指向,window
赋值式 var fun = function(){} this指向,window
forEach()循环 this指向,window
定时器,延时器 setInterval(function(){} , 时间)
this指向,window
对象中的函数 const obj = {fun:function(){}}
this指向,obj对象
事件处理函数 标签.addEventListener(事件类型,function(){})
this指向,标签对象
箭头函数的this指向,是父级程序的this指向
如果父级程序有this指向,指向向的就是父级程序的this指向
如果父级程序没有this指向(对象,数组是没有this),指向的是window
- apply call bind
函数.call(参数1,其他参数...)
立即执行函数,并且改变函数的this指向为参数1表示的内容
其他参数,是原始函数的实参,多个实参使用逗号间隔
函数.apply(参数1,[数组参数])
立即执行函数,并且改变函数的this指向为参数1表示的内容
数组参数,是原始函数的参数,多个参数以数组的单元的形式存储
函数.bind(参数1)
不会立即执行函数,而是生成一个新的函数
新函数,参数,程序内容,都与原始函数相同
只是this改变为参数1表示的内容
promise对象 三种状态与链式调用
作用
-
处理JavaScript里的异步
-
避免回调地狱。
状态
pending、fulfilled、rejected(未决定,履行,拒绝),同一时间只能存在一种状态,且状态一旦改变就不能再变
-
初始化,状态:pending
-
当调用resolve(成功),状态:pengding=>fulfilled
-
当调用reject(失败),状态:pending=>rejected
promise的then方法传参
let promiseDemo = new Promise((resolve, reject) => {
// code
resolve('success')
// code
reject('failed')
})
promiseDemo.then((result) => { //成功调用传参('success')
console.log(result)
}, (result) => {
console.log(result) //失败调用传参('failed')
});
//------------把reject函数拿出来做为catch
promiseDemo.then((result) => {
console.log(result) 成功调用传参('success')
}).catch((result) => {
console.log(result)
})
使用Promise.resolve()快速获取一个成功状态的promise对象
使用Promise.reject()快速获取一个拒绝状态的promise对象
可以通过Promise.resolve()将一个字符串、数字或者对象等转换成一个成功状态的Promise对象。
let b = Promise.resolve({name:'xiaoming', age:18})
b.then((result) => {
console.log(result) // {name:'xiaoming', age:18}
})