I think it's a good idea that would make things more efficient. +1 *#!/*JoePea
On Thu, Sep 17, 2020 at 12:57 PM Andrea Giammarchi < andrea.giammar...@gmail.com> wrote: > I'm not sure I'm following, but I'm not here to find solutions, I already > have solutions, I'm here to propose a new `Function.prototype.bindContext` > method that doesn't require any user-land discussion/prototype pollution. > > Thanks. > > On Thu, Sep 17, 2020 at 9:25 PM Adam Eisenreich <a...@seznam.cz> wrote: > >> This should able to be done via two nested WakMap, >> >> First level would be the function and the second the context or vice >> versa. This should be able to give you the same bound function while both >> are avaible, but should clear itself once the reference to function/context >> is lost. >> >> ---------- Původní e-mail ---------- >> Od: Andrea Giammarchi <andrea.giammar...@gmail.com> >> Komu: es-discuss@mozilla.org <es-discuss@mozilla.org> >> Datum: 17. 9. 2020 21:03:45 >> Předmět: Proposal: Function.prototype.bindContext >> >> I've found myself (once again) polluting the `Function.prototype` with a >> lazy method that, once invoked, grants that the returned bound function is >> always the same, per context. >> >> # Use Case >> >> It's still a common footgun to add events either via `context.method` or >> via `context.method.bind(context)`, where the former footgan would invoke >> `method` with a global context/undefined instead of the expected context, >> while the latter would make it impossible to ever remove that listener >> later on. >> >> It's also common to use methods for timers sensitive things, and it's >> indeed not by accident that `console` got "self bound", or provided as >> namespace, when it used to throw if `setTimeout(console.log, 100, value)` >> was used, for example. >> >> # Proposal >> >> Provide a lazy `bindContext` method that grants that if a method/function >> bound the same context before, it always returns the same reference. >> >> # Implementation / Polyfill (lazy version) >> >> ```js >> Function.prototype.bindContext = function (context) { >> const _ = new WeakMap; >> this.bindContext = bindContext; >> return bindContext.call(this, context); >> function bindContext(context) { >> if (!_.has(context)) >> _.set(context, this.bind(context)); >> return _.get(context); >> } >> }; >> ``` >> >> # Implementation details >> >> As the method suggest, and differently from `bind`, `bindContext` accepts >> only one argument, and it should throw with any context that is primitive >> (boolean, number, string, undefined, null), like any WeakMap key would >> throw as well. >> >> # Why not user-land / libraries / helpers >> >> Because standardizing a well-known/needed utility to not footgun common >> patterns would make the debate regarding global prototypes pollution >> irrelevant, as it's the standard that helps us out. >> >> In a few words, this might erase tons of common mistakes, but it also >> could be simplified within some helper/library, as long as not all of them >> need to include the proposed polyfill through a package or another. >> >> Thanks for consideration 👋 >> >> _______________________________________________ >> es-discuss mailing list >> es-discuss@mozilla.org >> https://mail.mozilla.org/listinfo/es-discuss >> >> _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss