Javascripts .call()
и .apply()
методы позволяют вам установить контекст для функции.
var myfunc = function(){
alert(this.name);
};
var obj_a = {
name: "FOO"
};
var obj_b = {
name: "BAR!!"
};
Теперь вы можете вызывать:
myfunc.call(obj_a);
Что бы предупредить FOO
.Наоборот, прохождение obj_b
предупредит BAR!!
.Разница между .call()
и .apply()
заключается в том, что .call()
принимает список через запятую, если вы передаете аргументы своей функции, а .apply()
нужен массив.
myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);
Следовательно, вы можетелегко написать функцию hook
, используя метод apply()
.Например, мы хотим добавить функцию в метод jQuerys .css()
.Мы можем сохранить исходную ссылку на функцию, переписать функцию с помощью пользовательского кода и вызвать сохраненную функцию.
var _css = $.fn.css;
$.fn.css = function(){
alert('hooked!');
_css.apply(this, arguments);
};
Поскольку магический объект arguments
является массивом, подобным объекту, мы можем просто передать его в apply()
.Таким образом, мы гарантируем, что все параметры переданы исходной функции.