Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Function.prototype.bind() is unconditionally overwritten with a bad polyfill #59

Open
mpetrovich opened this issue Sep 19, 2014 · 1 comment

Comments

@mpetrovich
Copy link

mpetrovich commented Sep 19, 2014

This issue can cause seemingly random issues with other scripts and libraries. For instance, this issue is the cause of our Intercom integration not working.

kartograph.js / src / core / proj.coffee, line 22:

Function::bind = (scope) ->
    _function = @
    ->
        _function.apply scope,arguments

This overwrites Function.prototype.bind() even for browsers that have it natively. Even worse, this polyfill is not correct per the spec. bind() can take any number of additional arguments to pass to the bound function: fun.bind(thisArg[, arg1[, arg2[, ...]]]).

Please (a) conditionally assign the polyfill, and (b) use a better polyfill:

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,
               aArgs.concat(Array.prototype.slice.call(arguments)));
      };

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

  return fBound;
};
@stereoscott
Copy link

+1 from us on this. The patch just required changing Function::bind = (scope) -> to Function::bind ?= (scope) ->

brew added a commit to openspending/cameroon.openspending.org that referenced this issue May 25, 2018
Kartograph is incompatible with our cookie consent script
(kartograph/kartograph.js#59), so we're just
removing the GA tracking and the need for the consent script.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants