重写apply, call, bind方法

  1. //原生JavaScript封装apply方法,第四版
  2. Function.prototype.applyFour = function(context) {
  3. var context = context || window
  4. var args = arguments[1] //获取传入的数组参数
  5. var fn = Symbol()
  6. context[fn] = this //假想context对象预先不存在名为fn的属性
  7. if (args == void 0) { //没有传入参数直接执行
  8. return context[fn]()
  9. }
  10. var fnStr = 'context[fn]('
  11. for (var i = 0; i < args.length; i++) {
  12. //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行
  13. fnStr += i == args.length - 1 ? args[i] : args[i] + ','
  14. }
  15. fnStr += ')'
  16. var returnValue = eval(fnStr) //还是eval强大
  17. delete context[fn] //执行完毕之后删除这个属性
  18. return returnValue
  19. }

ES6 JavaScript封装apply方法

  1. //简单模拟Symbol属性
  2. function jawilSymbol(obj) {
  3. var unique_proper = "00" + Math.random();
  4. if (obj.hasOwnProperty(unique_proper)) {
  5. arguments.callee(obj)//如果obj已经有了这个属性,递归调用,直到没有这个属性
  6. } else {
  7. return unique_proper;
  8. }
  9. }
  10. //原生JavaScript封装apply方法
  11. Function.prototype.applyFive = function(context) {
  12. var context = context || window
  13. var args = arguments[1] //获取传入的数组参数
  14. var fn = jawilSymbol(context);
  15. context[fn] = this //假想context对象预先不存在名为fn的属性
  16. if (args == void 0) { //没有传入参数直接执行
  17. return context[fn]()
  18. }
  19. var fnStr = 'context[fn]('
  20. for (var i = 0; i < args.length; i++) {
  21. //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行
  22. fnStr += i == args.length - 1 ? args[i] : args[i] + ','
  23. }
  24. fnStr += ')'
  25. var returnValue = eval(fnStr) //还是eval强大
  26. delete context[fn] //执行完毕之后删除这个属性
  27. return returnValue
  28. }

原生JavaScript封装apply方法

https://juejin.im/post/5ce4b0c6e51d455d6d535770

重写apply, call, bind方法的更多相关文章

  1. 理解JS中的call、apply、bind方法(*****************************************************************)

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  2. Javascript中call,apply,bind方法的详解与总结

    在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...

  3. JS中的call、apply、bind方法

    JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]] ...

  4. 简单模拟实现javascript中的call、apply、bind方法

    目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的 ...

  5. JS中的call、apply、bind方法详解

    bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...

  6. javascript中函数的call,apply及bind方法

    call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,  [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象. ...

  7. js中的call()、apply()和bind()方法的区别

    call(thisObj,param1,param2....)方法:调用一个对象的方法,用另外的对象去替换当前对象. 下面给出一个例子: function add(a,b){ return a+b; ...

  8. 继承:call、apply、bind方法

    javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. call,apply,bind这 ...

  9. JavaScript中的call、apply、bind方法的区别

    在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...

随机推荐

  1. 【原创】Java基础之ClassLoader类加载器简介

    classloader简介 1 classloader层次结构(父子关系) Bootstrap(ClassLoader) ExtClassLoader AppClassLoader XXXClassL ...

  2. [转]Ubuntu中apt与apt-get命令的区别

    转载于https://www.sysgeek.cn/apt-vs-apt-get/ Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入.其实早在 2014 年,apt 命令 ...

  3. C++入门篇一

    双冒号(::)的作用:作用域运算符,全局作用域 void LOL::game1(){//在LOL命名空间下面的game1 cout << "LOL游戏开始" <& ...

  4. Java基础try-with-resource语法源码分析

    众所周知,所有被打开的系统资源,比如流.文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故. 在Java的江湖中,存在着一种名为finally ...

  5. windows和linux换行规则的区别

    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这 ...

  6. entityframework单例模式泛型用法

    public class yms_Entity<T> where T :DbContext { private static T _instance; public static read ...

  7. Redis 数据结构之dict(2)

    本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis 数据结构之dict>,我们对dict的结构有了大致的印象.此篇文章对dict是如何维护数据结构的做个详细的理解. 老规 ...

  8. Nginx服务器中的Socket切分,需要的朋友可以参考下

    NGINX发布的1.9.1版本引入了一个新的特性:允许使用SO_REUSEPORT套接字选项,该选项在许多操作系统的新版本中是可用的,包括DragonFly BSD和Linux(内核版本3.9及以后) ...

  9. SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对二元函数优化求解——Jason niu

    %SA:T1法利用Matlab编写主函数实现对定义域[-5,5]上的二元函数求最优解—Jason niu [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 + ...

  10. 关于FastReport在winform中的使用(包含FastReport.net的安装步骤链接)

    一.FastReport的简介 FastReport是功能齐全的报表控件,使开发者可以快速并高效地为·NET/VCL/COM/ActiveX应用程序添加报表支持. 二.FastReport的安装(推荐 ...