Javascript 使用var会使脚本无法工作
我有一个数学游戏的代码: HTML: 当我在Javascript 使用var会使脚本无法工作,javascript,jquery,Javascript,Jquery,我有一个数学游戏的代码: HTML: 当我在newProblem()函数中的number1和number2前面添加var时,脚本无法工作。我得到未捕获的引用错误:未定义number1 为什么会这样?因为number1和number2是newProblem()函数作用域的本地对象,因此它在单击处理程序中不可用。解决方案是在两个方法共享的范围内声明它 $(document).ready(function () { $('#answer').focus(); $('#problem'
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
,则该变量将成为一个隐式全局变量声明(在窗口
对象上),并使其在任何地方都可用。这通常是非常糟糕的做法,因为跟踪可以使用且更危险地更改的全局文件,任何地方都是一场噩梦。最好的方法是更改变量
和参数
的名称
。似乎范围界定有问题
最好的方法是更改变量
和参数的名称
。似乎范围界定有问题
不错,非常有帮助我喜欢这个组织,从你的帖子中学到的。很好,非常有帮助我喜欢这个组织,从你的帖子中学到的。