apply和call的区别就是传的参数形式不一样。call是一个一个的传,apply可以将参数以数组的形式传进去。而bind是传入第二个和后面的参数,且绑定this,返回一个转化后的函数。思量两点:
Function.prototype.myCall = function(context) { // 判断是否是undefined和null if (typeof context === 'undefined' || context === null) { context = window } context.fn = this let args = [...arguments].slice(1) let result = context.fn(...args) delete context.fn return result }
Function.prototype.myApply = function(context) { if (typeof context === 'undefined' || context === null) { context = window } context.fn = this let args = arguments[1] let result if (args) { result = context.fn(...args) } else { result = context.fn() } delete context.fn return result }
这里需要注意下,由于bind转换后的函数可以作为组织函数使用,此时this应该指向组织出的实例,而bind函数绑定的第一个参数。
Function.prototype.myBind = function(context) { if (typeof this !== 'function') { throw new TypeError('Error') } let _this = this let args = [...arguments].slice(1) return function F() { // 判断是否被当做组织函数使用 if (this instanceof F) { return _this.apply(this, args.concat([...arguments])) } return _this.apply(context, args.concat([...arguments])) } }
1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入
3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入
链接: http://www.fly63.com/article/detial/2216