У меня есть довольно большой скрипт Javascript с множеством глобальных переменных. & функции в нем. Затем фрагмент кода, который вызывает одну функцию из этого js-файла: myfunc();Javascript Namespace Help
Итак, теперь я клонировал этот скрипт и модифицировал некоторые функции, все прототипы функций и переменные называются одинаковыми в обоих сценариях. Итак, теперь у меня два загруженных сценария и один вызов myfunc(), теперь у нас есть столкновение, потому что есть множество глобальных переменных с одинаковыми именами и двумя myfunc() s.
Что я хочу сделать, это обернуть этот клонированный скрипт в пространство имен, чтобы я мог изменить исходный вызов: clone.myfunc(), который вызовет новую функцию, но я также хочу, чтобы myfunc() просто ссылался к оригинальному сценарию. Другими словами, я не могу коснуться оригинального сценария (никаких разрешений), и я хочу иметь возможность использовать как клон, так и оригинал во время выполнения.
Это сценарий им Клонирование: http://pastebin.com/6KR5T3Ah пространств имен
Javascript, кажется, довольно сложно это, кажется, хороший метод имен:
var namespace = {
foo: function() {
}
bar: function() {
}
}
...
namespace.foo();
}
Однако это требует использования объекта, и сценарий (как вывешено выше) является огромным около 4000 строк, слишком много, чтобы объективировать, я думаю?
Кто-нибудь знает лучшее решение, чтобы избежать загрязнения пространства имен, с одним скриптом, который я не могу прикоснуться, и одним из них является клон этого скрипта. Просто чтобы я мог вызвать myfunc() и clone.myfunc(), и все глобальные переменные будут вести себя в их уважаемой области.
Это либо так, либо я пройти и изменить все, чтобы иметь уникальные имена, которые могут занять всю жизнь
Это Mozilla аддон, если это помогает контекст мудрым.
Спасибо.
Я думаю, что «окно» может не работать, если это плагин Mozilla, но я предполагаю, что передача этого «this» в функцию-оболочка будет работать и в этом контексте. Конечно, я ошибаюсь, поскольку я никогда не делал плагина. – Pointy
Большое спасибо. Если я беру метод 1 выше, что происходит, когда анонимная функция вызывается сразу после ее объявления? Просто я не хочу ничего (функционально мудрый) исполнить, пока я не вызову myfunc() явно где-то еще в кодовой базе. Также, используя метод 1, я правильно понимаю, что могу включить столько функций и переменных, сколько хочу внутри этой пространства имен/анонимных функций, а затем просто экспортировать все, что мне нужно для публичного доступа? – Jason
@Jason: Выполнение анонимной функции сразу же является тем же самым, что и отсутствие оболочки функций - создаются переменные, функции создаются, но не вызываются никакие функции, если только они не вызваны.:-) И да, вы можете включить столько функций там, сколько хотите. Библиотеки JavaScript часто используют эту идиому, чтобы они могли иметь множество частных внутренних функций и экспортировать только те, которые действительно нужны. –