JS函数之不要随便bind

作者: 寂寞的原子 | 来源:发表于2015-10-28 09:40 被阅读1379次

JavaScript在ES5中加了个Function.prototype.bind,可以绑定当前对象,于是就不需要再放一个变量来保存this了,在需要使用this的情况下会很方便。

那么Function.prototype.bind到底是怎么实现的呢?原生的实现先不说,Polyfill是我们可以看到的(参考MDN),像这样:

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis || window,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

不难看出,我们得到的其实是一个全新的函数!原函数被封装起来了,然后在调用的时候强制为它指定this
从结果上来看,浏览器原生的Function.prototype.bind也是如此。
CoffeeScriptfat arrow=>)实现的绑定比这个轻量一些,但也是需要将原函数和当前对象存起来,并返回一个新的函数:

func = (a) => doSomething(a)

var func = (function(_this) {
  return function(a) {
    return doSomething(a);
  };
})(this);

那么为什么不要滥用呢?
我测试了一下浏览器原生的Function.prototype.bind,发现使用了bind之后,函数的内存占用增加了近2倍!CoffeeScript实现的绑定稍微轻量一点,内存占用也增加了1倍多。

再顺便测试了下ES6新增的Arrow function(也是=>),因为这个特殊函数是自带绑定技能的,结果惊奇地发现,它的内存占用和普通的Function没啥区别。所以以后需要或者不需要bind的场景如果一定要滥用bind图个安心的话,可以通通上高逼格的箭头函数。:)

相关文章

  • JS函数之不要随便bind

    JavaScript在ES5中加了个Function.prototype.bind,可以绑定当前对象,于是就不需要...

  • javascript练习分析(一)

    理解 Prototype.js的bind()函数 fun.bind(this,arg1,arg2)bind()方法...

  • Underscore源码阅读:bind

    bind函数 参考:JavaScript深入之bind的模拟实现 bind(function, object, *...

  • 知识汇总

    1.js函数的this指向问题:不要再问我this指向问题了 补充知识:call,apply,bind的区别 在J...

  • JavaScript深入之bind的模拟实现

    JavaScript深入之bind的模拟实现 bind() 方法会创建一个函数,当这个新函数被调用的时候,bind...

  • react性能优化 不要再component的props中使用箭头函数或者bind,因为每次使用箭头函数和bind...

  • this深入理解

    js中this指向有几种情况 全局环境 函数调用 构造调用 apply、call、bind绑定 箭头函数 全局环境...

  • js 手写bind函数

    先看一个bind函数的例子: 如果我们要手写一个bind函数的话,我们需要知道bind拿了什么参数,干了什么:①接...

  • JS 手写bind函数

    先看一个bind函数的例子: 如果我们要手写一个bind函数的话,我们需要知道bind拿了什么参数,干了什么:①接...

  • JS中函数的bind、call、apply总结

    如图,js函数本身就具有一些方法和属性 下面介绍一些常用方法。 1.bind方法 bind方法可以改变函数在被执行...

网友评论

  • bce46f69ea84:因为是伸手党,所以非常感谢大大这样对性能仔细测试的
  • JetLu:狠狠的赞

本文标题:JS函数之不要随便bind

本文链接:https://www.haomeiwen.com/subject/unwxhttx.html