Переменная область в JavaScript (Dojo) - PullRequest
2 голосов
/ 25 сентября 2010

Я немного поигрался с Dojo, и мне любопытно узнать о проблеме с переменной областью, с которой я столкнулся.

У меня есть следующий код:

<div dojoType="dijit.form.Button">
    <script type="dojo/method" event="onClick" args="evt">
        console.dir(lastSelectedItem);
    </script>
    Rename
</div>

<div dojoType="dojo.data.ItemFileReadStore" url="/js/treeData.json" jsId="ordJson"></div>

<div dojoType="dijit.tree.ForestStoreModel" rootLabel="Order" store="ordJson" jsId="ordModel"></div>

<div dojoType="dijit.Tree" id="ordTree" model="ordModel">
    <script type="dojo/method" event="onClick" args="item">
        lastSelectedItem = item;
    </script>
</div>

Если я оставлю это на этом, он работает нормально. Однако если я заменю lastSelectedItem на "var lastSelectedItem", lastSelectedItem не будет виден в области, где вызывается console.dir (lastSelectedItem). Какой эффект имеет "var" в этом случае, я думал, что он все равно неявно ставится?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 25 сентября 2010

var определяет переменную в текущей области. Если вы находитесь внутри функции (обработчики событий являются функциями), она определяет локальную переменную, которая существует только внутри этой самой функции. Если вы находитесь вне функции, она определяет глобальную переменную.

Не указывать var при присваивании несуществующей переменной всегда определяется глобальная переменная. Лично я предпочитаю определять все глобальные переменные в глобальной области видимости с помощью var или использовать window.foo для доступа к ним, чтобы сделать это явным образом, я хотел использовать глобальную переменную и чтобы я не оставлял var авария.

0 голосов
/ 25 сентября 2010

О, я отвечу на это так неточно, что я собираюсь получить отрицательные голоса.Для меня я считаю, что var - это сброс области видимости, поэтому она доступна только для других в той же области видимости.

Что мне кажется интересным, так это то, что происходит, когда вы определяете переменную в большей области видимости, затем переопределяете ее во внутренней области видимости, немного изменяете ее, а затем возвращаетесь во внешнюю область видимости.Я не знаю ответа, я уверен, что есть множество крайних случаев, но я действительно думаю, что это увлекательное место для изучения.

...