Javascript 使用var会使脚本无法工作

Javascript 使用var会使脚本无法工作,javascript,jquery,Javascript,Jquery,我有一个数学游戏的代码: HTML: 当我在newProblem()函数中的number1和number2前面添加var时,脚本无法工作。我得到未捕获的引用错误:未定义number1 为什么会这样?因为number1和number2是newProblem()函数作用域的本地对象,因此它在单击处理程序中不可用。解决方案是在两个方法共享的范围内声明它 $(document).ready(function () { $('#answer').focus(); $('#problem'

我有一个数学游戏的代码:

HTML:

当我在
newProblem()
函数中的number1和number2前面添加
var
时,脚本无法工作。我得到
未捕获的引用错误:未定义number1


为什么会这样?

因为
number1
number2
newProblem()
函数作用域的本地对象,因此它在单击处理程序中不可用。解决方案是在两个方法共享的范围内声明它

$(document).ready(function () {

    $('#answer').focus();
    $('#problem').append(newProblem());


    $('#submit').on('click', function () {
        var userAnswer = $('#answer').val();

        if (checkAnswer(number1, number2, userAnswer)) {
            $('#answerMessage').html('');
            $('#answerMessage').append("Great!");

            $('#problem').html('');
            $('#problem').append(newProblem());

            $('#answer').val('');
            $('#answer').focus();
        } else {
            $('#answerMessage').html('');
            $('#answerMessage').append("Oops");

            $('#answer').val('');
            $('#answer').focus();
        }
    });

    function checkAnswer(number1, number2, answer) {
        if (number1 + number2 == answer) {
            return true;
        }
        return false;
    }

    //make these two to be in a closure scope accessible to both newProblem and click handler
    var number1, number2;

    function newProblem() { // could just return 1 number, then we call it twice.
        number1 = Math.floor(99 * Math.random()) + 1; // adding var here fails
        number2 = Math.floor(99 * Math.random()) + 1;
        return number1 + " + " + number2;
    }
});

我将在dom就绪处理程序中声明变量,并将方法
newProblem
checkAnswer
移动到dom就绪处理程序中。

因为
number1
number2
newProblem()
函数作用域的本地变量,所以它在单击处理程序中不可用。解决方案是在两个方法共享的范围内声明它

$(document).ready(function () {

    $('#answer').focus();
    $('#problem').append(newProblem());


    $('#submit').on('click', function () {
        var userAnswer = $('#answer').val();

        if (checkAnswer(number1, number2, userAnswer)) {
            $('#answerMessage').html('');
            $('#answerMessage').append("Great!");

            $('#problem').html('');
            $('#problem').append(newProblem());

            $('#answer').val('');
            $('#answer').focus();
        } else {
            $('#answerMessage').html('');
            $('#answerMessage').append("Oops");

            $('#answer').val('');
            $('#answer').focus();
        }
    });

    function checkAnswer(number1, number2, answer) {
        if (number1 + number2 == answer) {
            return true;
        }
        return false;
    }

    //make these two to be in a closure scope accessible to both newProblem and click handler
    var number1, number2;

    function newProblem() { // could just return 1 number, then we call it twice.
        number1 = Math.floor(99 * Math.random()) + 1; // adding var here fails
        number2 = Math.floor(99 * Math.random()) + 1;
        return number1 + " + " + number2;
    }
});

我将在dom就绪处理程序中声明变量,并将方法
newProblem
checkAnswer
移动到其中。

它是在函数中声明的,这意味着它只能在那里访问。如果希望变量可以全局访问,可以删除var。 在代码中,您使用的变量与此处相同:

 if ( checkAnswer(number1, number2, userAnswer) ) {
}

它是在函数中声明的,这意味着它只能在函数中访问。如果希望变量可以全局访问,可以删除var。 在代码中,您使用的变量与此处相同:

 if ( checkAnswer(number1, number2, userAnswer) ) {
}

尝试在脚本顶部声明变量

var number1,number2;
$(document).ready(function() {

您正在全局使用它们

尝试在脚本顶部声明变量

var number1,number2;
$(document).ready(function() {

您正在全局使用它们,number1和number2被定义为函数newProblem()的局部变量。全局定义它们(在脚本中,在所有函数之外)。

number1和number2被定义为函数newProblem()的局部变量。全局定义它们(在脚本中,在所有函数之外)。

在触摸jQuery之前,您必须正确组织应用程序:


在触摸jQuery之前,您必须正确组织应用程序:


检查您在checkanswer函数调用中使用的number1和number2的代码,这意味着变量是全局变量而不是局部变量。检查我编辑的答案。检查您的代码您在checkanswer函数调用中使用的是number1和number2,这意味着变量是全局变量而不是局部变量。检查我编辑过的答案。谢谢——所以基本上为了让脚本工作,我从来没有声明过变量。我想无论如何(在全球范围内)声明它们都是一种好的做法。如果不使用
var
,则该变量将成为一个隐式全局变量声明(在
窗口
对象上),并使其在任何地方都可用。这通常是非常糟糕的做法,因为跟踪可以在任何地方使用的全局变量(更危险的是更改全局变量)是一场噩梦。谢谢——所以基本上为了让脚本工作,我从来没有声明变量。我想无论如何(在全球范围内)声明它们都是一种好的做法。如果不使用
var
,则该变量将成为一个隐式全局变量声明(在
窗口
对象上),并使其在任何地方都可用。这通常是非常糟糕的做法,因为跟踪可以使用且更危险地更改的全局文件,任何地方都是一场噩梦。最好的方法是更改
变量
参数
名称
。似乎
范围界定有问题
最好的方法是更改
变量
参数的
名称
。似乎
范围界定有问题
不错,非常有帮助我喜欢这个组织,从你的帖子中学到的。很好,非常有帮助我喜欢这个组织,从你的帖子中学到的。