Worth mentioning that D3.js, a popular visualization and SVG manipulating
library that I'm using heavily in my project, uses .call() to bind DOM
elements and invoke callbacks. Difficult to change that behavior without
overriding built-in function as you said, although I'm expecting something
cooler like: function (self = this) {}...... But never mind, thanks~

Yours,
Charles Weng

Andrea Giammarchi <andrea.giammar...@gmail.com>于2016年1月30日周六 00:56写道:

> Agreed there should be no changes in specs.
>
> However, you can solve with both utilities, one overwriting `call` (yak)
>
> ```js
> const boundCall = (f) => {f.call=(...a)=>f.apply(null,a);return f};
>
> function outer() {
>   const inner = boundCall((_this) => {
>     console.log(this.a, _this.b);
>   });
>   inner.call({b: 1});
> }
> outer.call({a: 2});
> ```
>
> and one creating Python like callbacks that will receive the `self` as
> first argument.
>
> ```js
> const snake = (f) => function snake(...a) {
>   return f.apply(this, [this].concat(a));
> };
>
> const outer = snake((outerSelf) => {
>   const inner = snake((innerSelf) => {
>     console.log(outerSelf.a, innerSelf.b);
>   });
>   inner.call({b: 1});
> });
> outer.call({a: 2});
> ```
>
> As you can see there are plenty of different tricks you can use to make
> your custom Promise do whatever you but if you want a hint do not ever call
> a method `call` or `apply` ... it's the most misleading name you could
> think of, no matter what's the purpose, IMHO
>
> Regards
>
>
>
>
>
>
>
>
> On Fri, Jan 29, 2016 at 5:31 PM, ` Mystery . <mystery...@gmail.com> wrote:
>
>> Yes, the example you show is sufficient for most scenarios.
>> However the situation I came across is more complex: The custom Promise
>> class I implemented uses .call() to bind the same "this" scope object
>> across different .then() tasks, so they can exchange variables just simply
>> by storing them in "this". Of course it will work if I just pass that
>> environment object as a parameter, but it would require a lot of work to
>> modify other callbacks that does not use "this" of the outer function.
>> Perhaps I should stick to storing a "self" variable instead of introducing
>> so many changes. ;)
>>
>> Andrea Giammarchi <andrea.giammar...@gmail.com>于2016年1月30日周六 00:07写道:
>>
>>> Sorry Charles, I'm not sure I understand. Would this work?
>>>
>>> ```js
>>> function outer() {
>>>   const inner = (_this) => {
>>>     console.log(this.b, _this.a);
>>>   };
>>>   inner({b: 1});
>>> }
>>> outer.call({a: 2});
>>> ```
>>>
>>> that should produce what you expect already, right? I think it's
>>> misleading to use `.call` with a bound/arrow function, as it's misleading
>>> to have two different `this` in params or body.
>>>
>>> Just my pov
>>>
>>>
>>> On Fri, Jan 29, 2016 at 4:37 PM, ` Mystery . <mystery...@gmail.com>
>>> wrote:
>>>
>>>>
>>>> Hi,
>>>>
>>>> @Andrea Giammarchi
>>>> Sorry, perhaps I didn't express myself clearly. I use .call() to
>>>> manually bind the context "this" to a function, and yes, the last one is
>>>> exactly what I need, accessing both contexts (inner and outer) which I
>>>> couldn't manage without using an additional variable, as described in the
>>>> following snippet:
>>>>
>>>> ```js
>>>> function outer() {
>>>>   const inner = function (_this = this) {
>>>>     console.log(this.b, _this.a);
>>>>   };
>>>>   inner.call({b: 1});
>>>> }
>>>> outer.call({a: 2});
>>>> ```
>>>>
>>>> @Jason Orendorff
>>>> I see. If JavaScript is going to support calling class functions with
>>>> class members as default parameters, it has to parse the default values
>>>> with the given "this" context at calling. Perhaps that's also the reason
>>>> why the most language does not support this feature, like C++ and
>>>> Python..... but it's JavaScript :)
>>>>
>>>> Thanks guys for the patient explanation.
>>>>
>>>> Yours,
>>>> Charles Weng
>>>>
>>>> On Fri, Jan 29, 2016 at 10:41 PM Jason Orendorff <
>>>> jason.orendo...@gmail.com> wrote:
>>>>
>>>>> On Fri, Jan 29, 2016 at 8:14 AM, ` Mystery . <mystery...@gmail.com>
>>>>> wrote:
>>>>> > IMHO I don't think the default parameters should be evaluated within
>>>>> the
>>>>> > context of the function being called, at least not while it's
>>>>> outside of
>>>>> > function body's region...... Is there a specific reason to do that,
>>>>> or it's
>>>>> > just a design preference?
>>>>>
>>>>> Sure, there is a reason: it's about how defaults are used.
>>>>>
>>>>> Most defaults are probably constants or empty objects. Those don't
>>>>> need to refer to any variables at all, so we can set them aside.
>>>>>
>>>>> Of the rest, I suspect *most* refer to previous parameters:
>>>>>
>>>>>     function send(sender, recip, message, onBehalfOf=sender) { ... }
>>>>>
>>>>> or the `this` for the current method call:
>>>>>
>>>>>     class MyArray {
>>>>>         ...
>>>>>         slice(start=0, stop=this.length) { ... }
>>>>>     }
>>>>>
>>>>> The only way to support these is to put the arguments in scope.
>>>>>
>>>>> (Another reason is consistency. This is how `var` initializers already
>>>>> work, and have always worked: initializers are in the scope of the
>>>>> bindings being initialized, and can use the values of previously
>>>>> initialized bindings on the same line of code.)
>>>>>
>>>>> -j
>>>>>
>>>>
>>>
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to