`this`: methods versus functions

Axel Rauschmayer axel at rauschma.de
Thu Nov 10 06:01:11 PST 2011


Clever (took me a moment to figure out what the comma operator does here...). And makes sense: You would not want an invoker to have that kind of power.

If it wasn’t so negative for performance, I probably would apply curryThis() to all of my methods:
    var obj = {
        method: function (self, arg) { // additional argument `self`
            someFunction(..., function() {
                self.otherMethod(arg);
            });
        }.curryThis(), // introduce an additional argument
        otherMethod: function (arg) { ... }
    }
    Function.prototype.curryThis = function () {
        var f = this;
        return function () {
            var a = Array.prototype.slice.call(arguments);
            a.unshift(this);
            return f.apply(null, a);
        };
    };

On Nov 10, 2011, at 1:15 , Mark S. Miller wrote:

> On Wed, Nov 9, 2011 at 4:00 PM, Brendan Eich <brendan at mozilla.com> wrote:
> On Nov 9, 2011, at 3:48 PM, Axel Rauschmayer wrote:
> 
> We talked about lexical this for functions long ago (Jan. 2008? at Google anyway) and IIRC Mark found a subtler flaw.
> 
> 
> I think my original example was smaller and more elegant. But the following is adequate to demonstrate the problem: 
> 
>   function Outer(secret) {
>     "use strict";
> 
>     this.v = secret;
>     this.w = secret * 2;
>     this.x = secret * 3;
> 
>     this.InnerPoint = function(x, y) {
>       this.x = x;
>       this.y = y;
>     };
>     this.InnerPoint.prototype = {
>       getX: function() { return this.x; },
>       getY: function() { return this.y; }
>     };
>   }
> 
> Alice does:
>   var outer = new Outer(mySecret);
>   var innerPoint = new outer.InnerPoint(3,5);
>   bob(innerPoint); // passed innerPoint to Bob, who Alice does not trust.
> 
> Today, Bob, receiving innerPoint, has no way to obtain Alice's secret. Given your proposal, Bob could do
> 
>   (1,innerPoint.getX)() / 3;
> 
> Today, if Bob does that, the getX call fails when it tries to evaluate undefined.x.
> 
> -- 
>     Cheers,
>     --MarkM

-- 
Dr. Axel Rauschmayer
axel at rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20111110/59e83542/attachment.html>


More information about the es-discuss mailing list