Вызывается неожиданное оповещение

#javascript

#javascript

Вопрос:

У меня есть следующий простой скрипт на странице

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript">
        var nsTest = function ()
        {
            var test = function ()
            {
                alert('nsTest.test');
            }

            var test2 = function ()
            {
                alert('nsTest.test2');
            }

            return {
                test: test,
                test2: test2
            }
        } ();

        function t()
        {
            alert(nsTest.test());
        }

        function t2()
        {
            alert(nsTest.test2());
        }
    </script>
</head>
<body>
    <input type="button" value="test" onclick="t()" />
    <input type="button" value="test2" onclick="t2()" />
</body>
</html>
  

Когда я нажимаю на любую из кнопок, я вижу ожидаемое предупреждение на экране, а затем второе предупреждение с надписью «не определено».

Это происходит в IE8 и FF3. Есть идеи, что происходит?

Спасибо,

Дэвид

Ответ №1:

Вы дважды произносите предупреждение. Вам не нужно говорить

оповещение (nsTest.test2());

вам просто нужно вызвать nsTest.test2();

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript">
        var nsTest = function ()
        {
            var test = function ()
            {
                alert('nsTest.test');
            }

            var test2 = function ()
            {
                alert('nsTest.test2');
            }

            return {
                test: test,
                test2: test2
            }
        }();

        function t()
        {
            nsTest.test();
        }

        function t2()
        {
            nsTest.test2();
        }
    </script>
</head>
<body>
    <input type="button" value="test" onclick="t()" />
    <input type="button" value="test2" onclick="t2()" />
</body>
</html>
  

На самом деле вам даже не нужны функции t1 и t2, вы можете просто использовать ссылку onclick на nsTest.test2() напрямую, как показано здесьhttp://jsbin.com/ageva5/2/edit

Комментарии:

1. Насколько глупо я себя чувствую сейчас? Так очевидно, когда на это указывают! Спасибо Daveo

Ответ №2:

Вы вызываете, t() который вызывает nsTest.test()

nsTest.test() предупреждает строку 'nsTest.test' , а затем не имеет возвращаемого значения, поэтому возвращает undefined .

t() затем получает возвращаемое значение и предупреждает о нем.

Ответ №3:

Сначала запускаются оповещения в nsTest, затем запускаются оповещения в t () и t2 (). Эти предупреждения предупреждают о возвращаемом значении nsTest.*. Эти значения не определены. Удалите эти предупреждения, чтобы получить только первое предупреждение.