2013-02-24 3 views
0

В: Что бы вы назвали локальной областью, находящейся в функции, находящейся внутри другой функции?Скользящие переменные в функциях JavaScript

Поясню:

У меня возникли проблемы с соглашением об именах, которые я хочу использовать. Вот простой пример:

!function($, window, undefined) { 
    var Variables = {}; 
    Variables.X = 1; 

    function myFunction() { 
     var local = {}; 
     local.X = 2; 
     $('.myClass').each(function() { 
      var local = {}; 
      local.X = 3; 
     }); 
    } 
}(jQuery, window); 

Теперь я решил, что я собираюсь использовать объект под названием «Переменные» для размещения всех объектов, которые являются общими в любом месте между функциями. Глобальная область действия, если хотите, ограничена внутри определения функции!() {}.

И я решил использовать объект «local» для размещения всех объектов, находящихся внутри функции. Моя проблема - это объем функции внутри функции. Я думаю, что мне нужно каким-то образом включить имя функции, чтобы сделать ее уникальной. Я знаю, что в этом тривиальном примере local.X представляет собой две отдельные переменные. Но я хочу назвать их отдельно, чтобы человек был более легко читаемым. Я не хочу возвращаться через 6 месяцев и задаюсь вопросом, что такое local.X.

Добавление к проблеме заключается в том, что это анонимная функция, поэтому нет никакого имени функции для привязки, чтобы сделать «локальную область» уникальной идентификацией. Возможно, мне придется составить правило, что если переменная требуется внутри функции обратного вызова, тогда дайте функции обратного вызова имя и привяжите локальную область к этому имени (каким-то образом).

+2

Я понимаю вашу проблему (переменная тень), но я не понимаю, что вы пытаетесь сделать и почему. –

ответ

2

, как вы пытаетесь настроить области немного странно, и на самом деле не пользуясь способом Javascript предназначен для обработки этого ...

Более стандартный подход будет что-то вроде этого:

function($, window, undefined) { 
    var x = 1; 

    function myFunction() { 
     var y = 2; 
     $('.myClass').each(function() { 
      var z = 3; 
     }); 
    } 
}(jQuery, window); 

конечно, кажется, что вы хотите использовать одни и те же имена переменных ... для внешней x вы могли бы дать ему пространство имен, например, myPlugin.x, но, пытаясь установить локальную область для , функция, переданная в each, не имеет для меня большого смысла ... для того, чтобы она повлияла на что-либо вне ее, вам придется просто использовать переменные в объем myFunction.

+0

Чтобы добавить к этому, «var» по существу совпадает с «локальным» для целей использования Филиппа. Когда вы говорите var x, вы гарантируете, что x будет локальным для этой области. – lmortenson

+0

Да, это правда ... и вы вполне можете использовать 'var x = 2;' внутри 'myFunction', если вам не нужно обращаться к внешнему' x'. –

+0

ОК, предположим, что я хочу сохранить копию «этого» объекта в каждой из трех перечисленных выше переменных. В моем сценарии у меня были бы Variables.this и local.this. Но я не знаю, что бы я назвал это внутри. –

2

Предлагаю полагаться на семантику. То есть каждая (даже анонимная) функция имеет некоторая цель была создана для.

Кроме того, он обеспечивает еще две преимущества: 1) улучшенную читаемость, 2) код самообеспечения (я имею в виду, что если у вас нетрудно дать осмысленное имя области, это означает, что ваша модель хороша, и вы проектируете согласно Single Responsibility Principle).

Надеюсь, это поможет.

Смежные вопросы