枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述重写apply, call, bind方法相关的知识,希望能为你提供帮助。
重写apply, call, bind方法
文章图片
文章图片
//原生javascript封装apply方法,第四版 Function.prototype.applyFour = function(context) { var context = context || window var args = arguments[1] //获取传入的数组参数 var fn = Symbol() context[fn] = this //假想context对象预先不存在名为fn的属性 if (args == void 0) { //没有传入参数直接执行 return context[fn]() } var fnStr = ‘context[fn](‘ for (var i = 0; i < args.length; i++) { //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行 fnStr += i == args.length - 1 ? args[i] : args[i] + ‘,‘ } fnStr += ‘)‘ var returnValue = https://www.songbingjia.com/android/eval(fnStr) //还是eval强大 delete context[fn] //执行完毕之后删除这个属性 return returnValue }
ES6 javaScript封装apply方法
文章图片
文章图片
//简单模拟Symbol属性 function jawilSymbol(obj) { var unique_proper = "00" + Math.random(); if (obj.hasOwnProperty(unique_proper)) { arguments.callee(obj)//如果obj已经有了这个属性,递归调用,直到没有这个属性 } else { return unique_proper; } } //原生JavaScript封装apply方法 Function.prototype.applyFive = function(context) { var context = context || window var args = arguments[1] //获取传入的数组参数 var fn = jawilSymbol(context); context[fn] = this //假想context对象预先不存在名为fn的属性 if (args == void 0) { //没有传入参数直接执行 return context[fn]() } var fnStr = ‘context[fn](‘ for (var i = 0; i < args.length; i++) { //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行 fnStr += i == args.length - 1 ? args[i] : args[i] + ‘,‘ } fnStr += ‘)‘ var returnValue = https://www.songbingjia.com/android/eval(fnStr) //还是eval强大 delete context[fn] //执行完毕之后删除这个属性 return returnValue }
原生JavaScript封装apply方法【重写apply, call, bind方法】
推荐阅读
- JMeter记录篇7——JMeter Http协议录制&录制手机APP脚本
- Android欢迎页面2秒钟后自动跳转到主页面
- Android-Java-死锁
- ORM之轻量级框架--Dapper
- vue-happy-scroll 使用及注意
- 如何修复Chrome STATUS BREAKPOINT错误(解决办法指南)
- 如何修复Windows 10上的服务错误1053(解决办法)
- 如何修复Windows 10中的句柄无效错误(解决办法指南)
- 如何修复Microsoft Edge STATUS BREAKPOINT错误(解决办法)