函数外部的变量是未定义的

时间:2014-01-21 16:52:58

标签: javascript jquery

http://jsfiddle.net/luketheterrible/BMedV/

我正在编写一个测验,用户必须通过单击左侧的div或右侧的div来从两个选项中进行选择。

$('#answers').on('click', 'div', function(event) {
    event.preventDefault(); 
    var input = "";

    function userAnswer(event) {
        var target = $(event.target);
        if(target.is('#answerLeft')) {
            alert("you clicked left");
            input = "left";
            return input;
        } else {
            alert("you clicked right");
            input = "right";
            return input;
        }
        return input;
    }

    alert(input);
    });
});

由于某种原因,变量“input”是未定义的。尽管有很多搜索,但我似乎无法找到一个答案,将输入定义为用户点击的div。

5 个答案:

答案 0 :(得分:2)

您定义了您的函数userAnswer,但您永远不会调用它。

userAnswer(event); // execute the function
alert(input);

http://jsfiddle.net/mblase75/BMedV/1/


更好的是,完全删除该功能:

$('#answers').on('click', 'div', function (event) {
    event.preventDefault();
    var input = "";
    //which answer did the user pick
    var target = $(event.target);
    if (target.is('#answerLeft')) {
        input = "left";
    } else {
        input = "right";
    }
    alert(input);
});

http://jsfiddle.net/mblase75/prPmJ/

答案 1 :(得分:1)

你永远不会打电话给你的方法...

$(document).ready(function(){
    $('#answers').on('click', 'div', function(event) {
        event.preventDefault(); 
        var input = userAnswer(event); // Need to call this method...

    //which answer did the user pick
        function userAnswer(event) {
            var target = $(event.target);
            if(target.is('#answerLeft')) {
                alert("you clicked left");
                input = "left";
                return input;
            } else {
                alert("you clicked right");
                input = "right";
                return input;
            }
            return input;
        }

        alert(input);
    });
});

答案 2 :(得分:1)

无需定义函数http://jsfiddle.net/BMedV/5/

$(document).ready(function(){
    $('#answers').on('click', 'div', function(event) {
        event.preventDefault(); 
        var input = "";

    //which answer did the user pick
        //function userAnswer(event) {
            var target = $(event.target);
            if(target.is('#answerLeft')) {
                alert("you clicked left");
                input = "left";
                //return input;
            } else {
                alert("you clicked right");
                input = "right";
                //return input;
            }
            //return input;
        //}

        //alert(input);
    });
});

答案 3 :(得分:1)

您还可以使用数据属性直接获取答案文本。

HTML

<div id="answerLeft" data-answer="left"></div>
<div id="answerRight" data-answer="right"></div>

的jQuery

$(document).ready(function(){
    $('#answers').on('click', 'div', function(event) {
        event.preventDefault(); 

        var input = $(this).data("answer");
        alert(input);
    });
});

我更新了您的jsFiddle以显示此信息:

答案 4 :(得分:0)

答案已经给出,你从不调用函数,因此输入永远不会给出值。然而,一个未来调试的提示:当一个变量最终没有这样的值时,通常意味着它从未被赋予一个,它被覆盖,或者你有一个范围问题。

其范围很多次,请查看变量的定义位置以及设置/调用它的位置。

如果您确定它不是范围问题,那么最有可能是另一个问题2.最好的方法是找出在整个代码中放置调试或(颤抖!)警报,并按照消息进行操作。所以每隔几行都会弹出一条消息并打印出变量。你将能够看到它是否获得了一个值,并且该值会丢失。

确保将消息放入所有函数中,这样如果最后你没有看到来自一个或多个函数的任何消息,你知道那些从未调用过的函数,那就是消息没有显示的原因。 / p>

在这种情况下,放置在你的功能中的按摩不会显示,很快就会发现这个功能从未被调用过。

HTH 祝你好运!