Ответ 1
когда вы назначаете функции переменным без ключевого слова var, они либо перезаписывают локальную переменную этого имени, либо добавляются в глобальное пространство имен. (так что ваш do_stuff - это глобальная функция, которую вы не хотите)
один из способов сделать то, что вы хотите, - явно указать, где вы хотите, чтобы ваша функция находилась.
(function($) {
$.fn.foo = function(options) {
// whatever $().foo() should do
};
$.fn.foo.do_stuff = function() {
console.log("hello world!");
};
$.fn.foo.do_stuff.do_other_stuff = function(){
alert("who are you?");
};
})(jQuery);
Edit
Это работает, потому что все функции в javascript являются объектами, что означает, что вы можете присваивать значения произвольному свойству.
Если вы хотите получить доступ к переменным других функций, вы можете переместить определения внутри других, например:
$.fn.foo.do_stuff = function() {
console.log("hello world!");
$.fn.foo.do_stuff.do_other_stuff = function(){
alert("who are you?");
};
};
но это будет означать, что функция определяется только после запуска другой функции и что каждый раз, когда вы запускаете эту функцию, она перезаписывает последнее определение.
Возможно, более идеальным решением было бы, чтобы каждая функция возвращала объект, содержащий вложенную функцию следующим образом:
(function($) {
$.fn.foo = function(options) {
// whatever $().foo() should do
var do_stuff = function(do_stuff_args) {
console.log("hello world!");
// do stuff with options and do_stuff_args
var do_other_stuff = function(other_args) {
alert("who are you?");
// here you have access to options, do_stuff_args, and other_args
};
return {
do_other_stuff: do_other_stuff
};
};
return {
do_stuff: do_stuff
}
};
})(jQuery);
и назовите его с помощью
foo().do_stuff(some_options).do_other_stuff(other_options);
или
var a = foo(stuff).do_stuff(some_options);
a.do_other_stuff(foo);
a.do_other_stuff(bar);