2016-12-03 4 views
0

Я хочу избавиться от _this/self/$ этой вспомогательной переменной в функции обратного вызова. Я пишу:

export class someClass { 
    someFunction = function() { 
    this.foo = "bar"; 
    this.anotherClass.doSomething(this, function(foo) { 
     console.log(this.foo, "/", foo); // "bar/another bar" 
    }); 
    } 
} 

и

export class anotherClass { 
    anotherFoo: string = "another bar"; 

    doSomething(_this, cb) { 
     cb.call(_this, this.anotherFoo); 
    } 
} 

Есть более простой способ сделать это? Я хотел бы избавиться от этого параметра.

ответ

2

Вы можете использовать arrow function передать функцию обратного вызова:

class someClass { 
    constructor() { 
    this.anotherClass = new anotherClass(); 
    } 

    someFunction() { 
    this.foo = "bar"; 
    this.anotherClass.doSomething(foo => { 
     console.log(this.foo, "/", foo); 
    }); 
    } 
} 

class anotherClass { 
    anotherFoo: string = "another bar"; 

    doSomething(cb) { 
    cb(this.anotherFoo); 
    } 
} 
+0

Это фантастический и более читаемый способ привязки текущего контекста к 'this'. Что касается компилятора, ничего не меняется :) –

+0

@MehmetBaker '.bind()' очень медленный, и большинство современных JS-движков имеют встроенную поддержку функций стрелок, которые намного быстрее создают внутри. – robertklep

+0

Я этого не знал, я посмотрю. Если это так, то ваш путь - это действительно самый точный ответ, который я думаю :) –

1

Вы можете изменить свой код, используя Function.prototype.bind

Это позволит связать конкретный контекст функции.

Для получения дополнительной информации: https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

export class someClass { 
    someFunction = function() { 
    this.foo = "bar"; 
    var callback = function(foo) { 
     console.log(this.foo, '/', foo); 
    }; 

    this.anotherClass.doSomething(callback.bind(this)); 
    } 
} 

и

export class anotherClass { 
    anotherFoo: string = "another bar"; 

    doSomething(cb) { 
    cb(this.anotherFoo); 
    } 
} 
+0

Я хочу, чтобы область применения в вызываемой функции , Я просто хочу иметь это значение вызывающей функции в обратном вызове вместо этого значения вызываемой функции. – Michael

+0

Я не мог полностью понять, что вы пытаетесь сделать. Я добавил код. Когда someClass вызывает doSomething, он вызывает его с областью someClass. Так что doSomething в anotherClass всегда будет вызывать обратный вызов, с которым он привязан. –

+0

Я понимаю, но в моем случае мне нужна оригинальная область действия doSomething(). Я не хочу его менять. Следовательно, параметр _ this. У меня просто было ощущение, что может быть более простое решение, которое сохраняет это в вызываемой функции и сохраняет ее в обратном вызове. Но, возможно, нет. – Michael