函数嵌套函数,内部函数拥有外部函数的引用
优点:
缺点
function foo(a){
console.log(a);
a=10;
console.log(a);
function a(){}
}
foo(1)
//第一步,创建AO对象
AO{
}
//第二步,将形参a的值设置为undefined
AO{
a:undefined
}
//第三步,将实参1赋值给a
AO{
a:1
}
//第四步,函数声明提升
AO{
a:function a(){}
}S
规定时间内重复触发只执行一次(最后一次)
function debounce(callback ,delay){
let timer = null
return function(){
clearTimeout(timer)
timer = setTimeout(() => {
callback()
clearTimeout(timer)
}, delay);
}
}
let btn = document.querySelector('button')
btn.addEventListener('click',debounce(()=>{
console.log('点击了');
},500))
规定一定时间段执行一次
function throttling(callback ,delay){
let timer = null//节流阀
return function(){
// 判断是否有操作进行,如果没有,就执行
if(!timer){
timer = setTimeout(() => {
callback()//执行操作
clearTimeout(timer)
timer = null//释放节流阀
}, delay);
}
}
}
let btn = document.querySelector('button')
btn.onclick=throttling(()=>{
console.log('点击了');
},1000)
将一个多参数的函数 分成多个函数 (彼此之间可以任意组成)
//简单柯里化
function sum(a, b, c) {
return a + b + c
}
//简单函数柯里化
function sum(a) {
return function (b) {
return function (c) {
return a + b + c
}
}
}
console.log(sum(1)(2)(3))//6
// 高阶函数柯里化
// 求和
function sum(a, b, c) {
return a + b + c
}
function currying(fn){
//接收传入的参数 arguments (不包含第一个fn)
let args = Array.prototype.slice.call(arguments,1)
return function(){
//接收
let allArgs = args.concat([...arguments])
if(allArgs.length < fn.length){
return currying.apply(this,[fn].concat(allArgs))
}else{
return fn.apply(this,allArgs)
}
}
}
let cuyfn = currying(sum)
console.log(cuyfn(1,2,3));
console.log(cuyfn(1)(2,3));
console.log(cuyfn(1)(2)(3));
核心思路
参数没到返回函数,参数到了返回结果
Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
解决异步问题
将异步代码同步执行
解决回调地狱
对象的状态不受外界影响。Promise
对象代表一个异步操作,
有三种状态:
pending(进行中)
fulfilled(resolved)(已成功)
rejected(已失败)
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise
这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和从pending
变为rejected
。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise
对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
//传入函数来进行构建 传入的函数内有两个参数传递
//new Promise是一个同步执行的代码 它的里面可以包含异步代码
new Promise((resolved,rejected)=>{
console.log('hello')//同步代码
})
所有的静态方法返回的都是一个新的promise对象
返回一个状态为成功的promise
返回一个状态为拒绝的promise
竞速方法,比较执行速度,谁先执行完,不区分状态,返回速度最快的promise
同步并行执行多个promise,返回一个promise,包含所有结果(若遇到reject,则只有一个reject结果)
同步并行执行多个promise,返回一个promise,(只要执行完成,则是resolve)
async和awiat是es7新增的修饰关键词
async属于语法糖(await一定要在async里面使用 且awiat修饰的是promise)
async function sayHello() {
return 'hello'
}
let promise = sayHello()
promise.then((result)=>{
console.log(result)//hello
})
async function say() {
await new Promise((resolved, rejected) => {
setTimeout(() => {
console.log(1)
resolved()
}, 2000)
})
console.log(2)
}
say()//1 2
async function test() {
await new Promise((resolved, rejected) => {
setTimeout(() => {
console.log(1)
resolved()
}, 2000)
})
await new Promise((resolved, rejected) => {
setTimeout(() => {
console.log(2)
resolved()
}, 2000)
})
await new Promise((resolved, rejected) => {
setTimeout(() => {
console.log(3)
resolved()
}, 2000)
})
console.log(4)
}
say()//1 2 3 4