Область действия в Javascript очень важна, если есть вложенные функции.
(Следите за комментариями в приведенном ниже коде)
Item.prototype.someAsyncCall = function(callback) { // <-- Item object/class is accessible in lexical *this*
var itemNo = this.itemNo; // Accessible
setTimeout(function() { // <-- Here, we have a closure with its own scope and ITS OWN lexical *this*
var itemNoDuplicate = this.itemNo; // Not accessible as we are inside `setTimeout` scope
if(typeof callback === "function") callback();
}, this.delay);
};
Есть несколько решений вашей проблемы:
Использовать шаблон ES6 с функцией стрелки:
Item.prototype.someAsyncCall = function(callback) {
// Arrow function in ES6 preserves lexical *this* of the closest parent
setTimeout(() => {
if(typeof callback === "function") callback();
}, this.delay);
};
Использовать bind
(если вы хотите придерживаться ES5)
Item.prototype.someAsyncCall = function(callback) {
setTimeout(function() {
var itemNo = this.itemNo; // Yeaah! Its accessible
if(typeof callback === "function") callback();
}.bind(this), this.delay);
// ^^^^^^^^^^^ -- We have bind the closest parents scope to this closure, // and now its accessible inside it
};
Пожалуйста, обратитесь к ответу Атишая Джайна в этой же ветке, чтобы узнать другой способ сделать это.