2012-01-31 8 views
1

У меня есть некоторые JavaScript, как это:Javascript область видимости функции и перезапись

<script> 

var num = 0; 

if(num==0){ 
    function lol(){ 
     alert("lol"); 
    } 
} else { 
    function lol(){ 
     alert("haha"); 
    } 
} 

</script> 

Затем, в конце страницы у меня есть:

<script>lol();</script> 

Как убедиться, что первая функция не всегда перезаписывается вторым в инструкции else?

Благодаря

+0

У вас есть состояние здесь. Поэтому этот скрипт определяет только одну функцию, первую или другую. В конечном счете, это зависит от состояния. В вашем случае будет запускаться предупреждение lol при каждом запуске этого скрипта. – Anthony

+0

Много отличных ответов, но я награждаю значок «ответил» человеку, который ответил первым и придерживался формата, который мне нужно выполнить :) Еще раз спасибо – Tim

+0

Спасибо. Стоит исследовать темы, упомянутые в ответах fyr и jAndy. –

ответ

0

Как насчет:

if(num == 0) { 
    lol = function() { 
     alert("lol"); 
    }; 
} 
else { 
    lol = function() { 
     alert("haha"); 
    }; 
} 
0
<script> 

var num = 0; 

if(num==0){ 
    var lol = function(){ 
     alert("lol"); 
    } 
} else { 
    var lol = function(){ 
     alert("haha"); 
    } 
} 

</script> 
0

Почему вы не реструктурировать код немного:

<script> 

var num = 0;  

function lol(){ 
    if(num==0){ 
     alert("lol"); 
    } else { 
     alert("haha"); 
    } 
} 
</script> 
1

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

var myFunction = someCondition 
        ? function() { 
         alert('foo'); 
         } 
        : function() { 
         alert('bar'); 
         }; 

myFunction(); 
1

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

очень исчерпывающее сравнение различных объявлений функций и углубленный предусмотрен внешний вид здесь: http://kangax.github.com/nfe/

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

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

Вот код, если вы не чувствуете, как чтение его:

<script> 

var num = 0; 
var lol = function(){ 
     alert("haha"); 
    }; 

if(num==0){ 
    lol = function(){ 
     alert("lol"); 
    }; 
} 

</script> 
+0

Я согласен с @fyr, чтобы лучше понять язык. В целом я рекомендовал «Javascript: The Good Parts» Дугласа Крокфорда (ISBN: 978-0596517748). Как хорошая книга, она также довольно короткая! –

3

ответа не предоставил надлежащее описание вашей проблемы там. Поэтому я сделаю все возможное. Проблема, с которой вы столкнулись, заключается в том, что function declarations (это то, что вы там получили) относятся к некоторым другим вещам, интерпретируемым до выполнения javascript. Этот эффект часто называют hoisting, и это означает, что эти функции действительно перемещаются в начало текущего контекста для времени выполнения скрипта.

Пример, в вашем фрагменте кода, это то, что происходит:

<script> 
    var num = 0; 

    function lol(){ 
     alert("lol"); 
    } 

    function lol(){ 
     alert("haha"); 
    } 

    if(num==0) { 

    } else { 

    } 
</script> 

Таким образом, простое решение в данном конкретном случае это, просто не использовать объявления функций, но вместо этого function expression. Мы можем заставить наш двигатель, чтобы создать FE несколько способов, например, мы можем назначить его как

var num = 0, 
    lol; 

if(num === 0) { 
    lol = function() { 
     alert('lol'); 
    }; 
} 
else { 
    lol = function() { 
     alert('haha'); 
    }; 
} 

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

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