2016-08-29 4 views
0

Я использую библиотеку, где я должен определить функцию обратного вызова, и библиотека будет выполнять эту функцию при наступлении определенного события:Добавить переменную в яваскрипта обратного вызова

// initialize the callback for the library. 
// `lib` is the main variable for the library and is defined globally 
function initializations() { 
    var extra_var = 'pass me into the callback'; 
    var libprops = { 
     libcallback: function(settings) { do stuff } 
    }; 
    lib.reconfigure(libprops); 
} 

Библиотека затем запускает обратный вызов, как так (я не имею никакого контроля над этим):

var settings = 'xyz'; 
libprops.libcallback(settings); 

Так ясно, один из входных переменных в мой определенной функции обратного вызова будет settings переменными. Однако я также хочу передать в переменной моей:

function mycallback(settings, extra_var) { 
    // do stuff involving settings 
    // do stuff involving extra_var 
} 

Как я могу определить libprops.libcallback в initializations() так, что extra_var передается в, но с функцией mycallback определены в другом месте? Т.е. так:

function mycallback(settings, extra_var) { 
    // do stuff involving settings 
    // do stuff involving extra_var 
} 

Возможно ли это? Причина, по которой я хочу определить mycallback() за пределами initializations(), состоит в том, что mycallback() довольно большой и ее грязный, чтобы он определил его внутри initializations().

Кажется, что закрытие решит проблему, но я не совсем уверен, как ее построить. Вот предварительная попытка:

function initializations() { 
    var extra_var = 'pass me into the callback'; 
    var libprops = { 
     libcallback: (function(settings) { 
      mycallback(settings, extra_var) 
     })(extra_var) 
    }; 
    lib.reconfigure(libprops); 
} 
+0

у вас уже есть замыкание, поэтому вам не нужно проходить в 'extra_var' где угодно, он доступен на анонимный callback function уже, как 'extra_var' –

+0

Спасибо @JaromandaX, я это понимаю, но я хочу определить' mycallback() 'вне' initializations() '. Я обновил вопрос, включив это важное требование. Извините за изменение игры. Это было очевидно для меня, но я понял, что это не было изначально включено в вопрос: P – mulllhausen

+0

just: 'libcallback: function (settings) {..}', удалить вызов функции с помощью 'extra_var' –

ответ

1

у вас уже есть замыкание, поэтому вам не нужно проходить в extra_var в любом месте, она доступна для вашей анонимной обратного вызова функции уже, как extra_var

function initializations() { 
    var extra_var = 'pass me into the callback'; 
    var libprops = { 
     libcallback: function(settings) { 
      // do stuff 
      // you can do stuff with extra_var here too 
     } 
    }; 
    lib.reconfigure(libprops); 
} 

согласно дополнительной информации в комментариях, просто позвоните своему myfunction в анонимной функции обратного вызова, передавая extra_vars в качестве второго параметра (или первой, если вы хотите, не имеет значения, это ваша функция)

function initializations() { 
    var extra_var = 'pass me into the callback'; 
    var libprops = { 
     libcallback: function(settings) { 
      mycallback(settings, extra_var); 
     } 
    }; 
    lib.reconfigure(libprops); 
} 

есть, вероятно, еще один способ использования .bind не - однако, нет необходимости в такую ​​гимнастику в таком простом сценарии

+0

Выглядит многообещающе!Я буду проверять и принимать, если он работает. Большое спасибо! – mulllhausen

+0

Как я могу получить доступ к 'lib' из' mycallback() '? Если его анонимная функция встроена в объект, тогда ее просто 'this', но' this' не ссылается на 'lib' внутри' mycallback() ' – mulllhausen

+0

ах, я нашел, что могу передать' this' в 'mycallback()' as третий параметр из анонимной функции во время определения, например: 'libcallback: function (settings) {mycallback (settings, extra_var, this);}' – mulllhausen

0

Да, будет закрытие, но вам не нужно вызывать функцию «сейчас». Вы можете создать функцию, которая ссылается на локальный extra_var и передать его вокруг:

function initializations() { 
    var extra_var = 'pass me into the callback'; 
    var libprops = { 
     libcallback: function(settings) { 
      // you can access both settings passed in as a parameter 
      // and extra_var, referenced locally. 
      var settingsLocal = settings, 
       another = extra_var; 
     } 
    }; 
    lib.reconfigure(libprops); 
} 

Если extra_var имеет фиксированное значение, как в примере, вы сделали. В другом месте вам необходимо уточнить ваш запрос.

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