一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
从2017年毕业后,就从事了前端开发。从最开始的javaScript/html/css,就写一些静态页面加一些css效果以及简单的js事件。再到jquery,这里就简化了很多js操作语句,jquery封装了很多方法,尤其是$这个变量,挂载到window上,因为其方便易用,简洁好记,让还是小白阶段的我舍弃了js,从此用上jquery。再到angular,不过这个语言只是了解,因为出现了更好用的vue。从此开始了vue养成之路。
期间小程序的语言也是在不断迭代,从最开始的wxml/wxss/js/json进行开发,再到wepy框架开发,再到mpvue框架开发,最后到现在使用中的mpx框架进行小程序的开发。uniapp用来随手练习了一下,当时app和小程序有2套,就考虑了用uniapp。
编程软件从最开始的dreamweaver到notepad,再到webstoram,最后稳定为vscode。
不得不说,前端涉及到的东西是真广,入门是真的简单,深入是真的需要时间来慢慢的积累。
好了,开始正题,bind,call,apply都是可以用来改变this的指向。区别在于它们的传参是不同的,call/bind/apply 这三个函数的第一个参数都是 this 的指向对象。call的传参的第二个以及后面的若干个形参;apply的传参的第二个参数是一个数组,数组里面可以包括若干个形参;bind 除了返回是函数以外,它的参数和call一样。
Function.protype.mycall = function(context,...arg){
if(typeof this !== 'function'){
throw new typeError('typeerror')
}
context = context || window
context.fn = this
let res
res = context.fn(...arg)
delete context.fn
return res
}
Function.protype.myapply = function(context,...arg){
if(typeof this !== 'function'){
throw new typeError('typeerror')
}
context = context || window
context.fn = this
let res
res = context.fn(...arg.flat())
delete context.fn
return res
}
Function.protype.mybind = function(context,...arg){
if(typeof this !== 'function'){
throw new typeError('typeerror')
}
let _this = this
return function(...rest){
_this.call(context,...arg,...rest)
}
}
柯里化的实现
function curry(fn){
rertun function f(...arg){
if(arg.length >= fn.length){
return fn(...arg)
}
return function(..._arg){
return f(...[...arg,..._arg])
}
}
}
//实现方式2
const curry = (fn,...args)=>{
return args.length >= fn.length ? fn(...args) : (..._args)=>curry(fn,...args,..._args)
}
闭包
闭包最常见的解释就是 上局作用域的变量因为下局作用域中有相关的引用,导致变量不会被释放掉。
最常见的应用场景就是 防抖,节流,for循环的引用。 下一篇文章就写防抖、节流、promise。
路漫漫其修远兮,每天进步一小步。