Это вопрос javascript привязки. Вот упрощение вашего случая, приведенного выше, который дает один и тот же результат независимо от bluebird.
const obj = {
a: function(){
console.log('A THIS!', this)
},
b: function(){
console.log('B THIS!', this)
}
}
function c_function(paramsFunction){
paramsFunction();
}
obj.a() // A THIS!, {a: function(), b: function()}
obj.b() // b THIS!, {a: function(), b: function()}
c_function(obj.a) //"A THIS!" global {Buffer: function(), clearImmediate: function(), clearInterval: function(), clearTimeout: function(), …}
c_function(function() { obj.a()}) // A THIS!, {a: function(), b: function()}
this
из javascript для выполнения функции привязывается при выполнении этой функции.
- Элемент списка
Таким образом, при вызове
obj.a()
он проверяет правила this и обнаруживает, что он был вызван для объекта, поэтому this
будет быть obj
.
При вызове
c_function(obj.a)
c_function получает функцию в качестве аргумента. Когда он выполняет функцию, он пытается привязать this. Что касается области c_function, функция не вызывается для объекта. Поэтому он свяжет это в соответствии с правилами. Здесь c_function
привязан к global this
, и при выполнении paramsFunction()
привязка будет такой же.
При звонке
c_function(function() { obj.a()}) // Or
c_function(() => { obj.a()})
Все знания 2-х предыдущих объединены. Важный вывод заключается в том, что в момент вызова, который вы вызываете, из obj
EXTRA Обратите внимание, что функция карты может вызывать вашу функцию с помощью bind
, call
или apply
. Это повлияет на объем выполняемой функции.
function c_function_binding(paramsFunction) {
paramsFunction.call({}, paramsFunction)
}
c_function_binding(obj.a) // "A THIS!" {}
Мне не удалось его найти, но через несколько лет go Кайл Симпсон прошел курс или семинар, на котором подробно объяснялась привязка области в javascript и всех его причудах.