2015-09-29 3 views
3

Часто в моем коде базовой линии я сталкиваюсь с ситуациями, когда я буду передавать закрытие некоторой функции и потерять контекст «этого».'self = this' vs apply or bind? (Магистраль)

Мое решение в течение некоторого времени было делать то, что я видел некоторые другие делают:

var self = this; 

this.deferred.done(function() { 
    self.render(); 
}); 

Или на самом деле я переключился на _this = this, но это рядом с точкой. Он работает, но он чувствует себя некрасиво, и мне иногда приходится делать это довольно часто. Поэтому я пытаюсь найти лучший способ сделать это. Я узнал, что я мог бы сделать это:

this.deferred.done(function() { 
    this.render(); 
}.apply(this)); 

И я думаю, что я мог бы также использовать подчерк это сделать:

this.deferred.done(_.bind(function() { 
    self.render(); 
}, this)); 

Метод apply кажется наиболее емким, но я чувствую, что у него есть побочный эффект (Я просто не знаю, что это такое).

Edit:

Взгляните на эту JSbin, где я использую применить аналогичный как я уже говорил: http://jsbin.com/qobumu/edit?js,console

Он работает, но он выдает ошибку, в то же время. Если я изменю apply на bind, он работает и не выдает ошибку.

+4

'.apply()' почти наверняка не то, что вы хотите; Я думаю, вы думаете о 'Function.prototype.bind()'. – Pointy

+3

'this.deferred.done (this.render.bind (this))' работает без ввода слова «функция» или обман – dandavis

ответ

5
  • Function.bind является нативный метод, нет необходимости для подчеркивания, если вы не кодирования для антикварных браузеров. Что именно @dandavis сказал: this.deferred.done(this.render.bind(this)) (но учтите, что bind также может связывать аргументы функции, а не только this)

  • , если вы на самом деле кодирования для ультрасовременных браузеров или node.js 4, вы можете использовать функции, которые со стрелками связать this лексически к тому, что он находится в объеме, где функция определена, так что вы могли бы написать: this.deferred.done(() => { this.render() });

+0

Это очень интересно. Хороший взгляд на будущее, но мне нужна лучшая поддержка браузера, чем функции стрелок. Кажется, что Bind работает так же, как и применить, но теперь я замечаю, что применил ошибку throw (я добавлю еще мой исходный вопрос.) – Zuko

+0

Да, потому что 'apply' выполняет функцию немедленно, как объясняет Алекс в своем ответе. Не полезно для обратных вызовов. – Touffy

+2

или [babel] (https://babeljs.io/)! : D –

4

Те делают разные вещи.

// returns a function with `this` set to what you want. 
_.bind(fn, this); 
// or 
fn.bind(this); 

// EXECUTES the function with `this` set to what you want. 
fn.apply(this); 

Так что в вашем случае это не обратный вызов вообще. Когда вы используете apply, вы используете , выполняя функцию, когда вы считаете, что задаете обратный вызов.

Вот почему вы используете bind.

+0

Спасибо за различие. – Zuko

Смежные вопросы