В первой цепи this
связан с окном и, следовательно, second
не видна (undefined
в этой области видимости).
(function(){
var first = function(){
console.log("1st Chain");
console.log(this);
return this;
};
window.second = function(){
console.log("2nd Chain");
}
first().second();
})();
Чтобы избавиться от экспорта глобального объекта окна второй функции, вы можете использовать объект, который виден только в области анонимной функции.
(function(){
var Chain = {};
Chain.first = function(){
console.log("1st Chain");
console.log(this);
return this;
};
Chain.second = function(){
console.log("2nd Chain");
return this;
}
// example
Chain.first().second().first();
// example export
// window.Chain = Chain;
})();
Если вы хотите цепи в другой области, вы можете экспортировать ваши Chain
в окно и использовать его без нового, то есть. Chain.first().second();
.
Вы также можете сохранить указатель на это (как указал Джонатон):
(function(){
var self = this;
this.first = function(){
console.log("1st Chain");
console.log(this);
return self;
};
this.second = function(){
console.log("2nd Chain");
return self;
}
// example
first().second().first();
// export example
// window.Chain = self;
})();
// exported anonymous function to Chain
// Chain.first().second();
Сохранение указатель на this
иногда необходимо, потому что это ключевое слово является сфера меняется, и относится к контексту выполненная функция. this
не относится к экземпляру объекта, где используется this
, как и в Java.
Каждая функция может поэтому связываться с другой областью. Чтобы настроить контекст функции, используйте bind, apply and call.
Просто зайдите 'this' в первой функции. –
Итак, в чем вопрос? – zerkms
Почему бы не вызвать первую функцию во второй функции? – JTC