Проблемы с областью JavaScript в Firefox - PullRequest
3 голосов
/ 06 февраля 2010
<div id="myElement2"></div>

<script>
window.onload = function() {
    document.getElementById("myElement1").onclick = function() {
        for (i = 0; i < 2; i++) {
            document.getElementById("myElement2").onmouseover = func;
            function func() {alert("hello"); } } } }
</script>

В chrome и IE при нажатии myElement1 функция func отлично присоединяется к myElement2. Однако в Firefox при нажатии myElement1 я получаю сообщение об ошибке, в котором говорится, что func не определен.

Следует отметить, что если вместо func сделать анонимную функцию, то она будет работать во всех трех браузерах.

Мой вопрос заключается в том, как Firefox обрабатывает область видимости в этом отношении по-другому, чем IE и Chrome?

Will.

Ответы [ 4 ]

5 голосов
/ 06 февраля 2010

Я думаю, проблема в том, что func определяется внутри блока. Попробуйте запустить код через JSLint , и вы заметите следующие проблемы:

  • Операторы функций нельзя помещать в блоки. Используйте выражение функции или переместите оператор в верхнюю часть внешней функции.
  • 'func' использовался до того, как он был определен.

Попробуйте назначить выражение функции вместо определения функции и присвоить ее по имени, возможно, так:

document.getElementById("myElement2").onmouseover = function() {
    alert("hello")
};
3 голосов
/ 08 февраля 2010

Что касается "как Firefox обрабатывает область видимости в этом отношении иначе, чем IE и Chrome?" - см http://kangax.github.com/nfe/#function-statements

0 голосов
/ 06 февраля 2010

У вас проблема с областью действия, потому что ваше определение функции находится внутри функции. Я обычно инкапсулирую функции в объекте. Вам, вероятно, тоже не нужен цикл.

Взгляните:

<div id="myElement1"></div>
<div id="myElement2"></div>
<script type="text/javascript">

    window.onload = function() {
        document.getElementById("myElement1").onclick = function() {
                document.getElementById("myElement2").onmouseover = myFunctions.func;
         }
     }
    /* Function definitions */ 
    var myFunctions = new Object();
    myFunctions.func = function () {
       alert("hello"); 
    }
</script>
0 голосов
/ 06 февраля 2010

Я бы порекомендовал переместить объявление перед присваиванием и использовать переменную для хранения функции вместо объявления ее глобально:

<script>
window.onload = function() {
    document.getElementById("myElement1").onclick = function() {
        for (i = 0; i < 2; i++) {
            var func = function() { alert("hello"); }
            document.getElementById("myElement2").onmouseover = func;
        }
    } 
}
</script>
...