Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
      • 如何遍历一个dom tree
      • 实现函数currying
      • 实现一个event
      • 详解js的继承
      • 详解requestAnimationFrame
      • Canvas api详解
      • DOM事件
      • EventLoop详解
      • JavaScript的内存管理
      • JavaScript的运行机制
      • Math对象
      • new操作符都做了什么
      • Object.create基本实现原理
      • Set、Map、WeakSet和WeakMap
      • web worker原理
      • WebGL教程(MDN)
    • jsInfoSeries

      • 简介
      • JavaScript基础知识
      • 基础知识2
      • 基础知识3
      • 基础知识4
    • 技巧

      • 5个js解构有趣用途
      • 如何使用set提高代码性能
      • cordova构建项目时的问题
      • js中轻松遍历对象属性的几种方式
    • JavaScript
    junwen
    2019-11-05

    简单实现bind、apply和call

    # bind

    Function.prototype.bind2 = function(context) {
      var _this = this;
      var argsParent = Array.prototype.slice.call(arguments, 1);
      return function() {
        var args = argsParent.concat(Array.prototype.slice.call(arguments));
        _this.apply(context,args);
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8

    参考 面试官问:能否模拟实现JS的bind方法 (opens new window)

    # apply

    Function.prototype.apply2 = function(context, arr) {
        var context = context || window;//因为传进来的context有可能是null
        context.fn = this;
        var args = [];
        var params = arr || [];
        for(var i = 0;i<params.length;i++) {
            args.push("params[" + i + "]"); //不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
        }
        args = args.join(",");
       var result = eval("context.fn(" + args + ")"); //相当于执行了context.fn(arguments[1], arguments[2]);
       delete context.fn;
       return result; //因为有可能this函数会有返回值return 
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # call

    Function.prototype.call2 = function(context) {
        var context = context || window; // 传进来的context有可能是空
        context.fn = this;
        var args = [];
        for (var i = 1; i < arguments.length; i++) { 
            args.push("arguments[" + i + "]"); //不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错 
        } 
        args = args.join(",");
        var result = eval("context.fn(" + args + ")"); //相当于执行了context.fn(arguments[1], arguments[2]); 
       delete context.fn; 
       return result; //因为有可能this函数会有返回值return
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    在Github上编辑此页 (opens new window)
    #JavaScript
    上次更新: 3/22/2021, 3:47:15 AM
    Promise&Generator
    如何遍历一个dom tree

    ← Promise&Generator 如何遍历一个dom tree→

    最近更新
    01
    如何打造全链路项目生命周期的统一交付平台
    04-10
    02
    如何建立前端标准化研发流程
    04-10
    03
    如何从0到1一步步成体系地搭建CI
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2019-2021 Syun
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式