变量范围-jQuery/JavaScript
我在jQuery/JavaScript中的变量范围方面遇到了一些问题。我将只给出一个代码示例来演示我的问题,因为它可能比试图用文字解释更容易理解变量范围-jQuery/JavaScript,javascript,jquery,variables,scope,Javascript,Jquery,Variables,Scope,我在jQuery/JavaScript中的变量范围方面遇到了一些问题。我将只给出一个代码示例来演示我的问题,因为它可能比试图用文字解释更容易理解 var example_1 = function() { row = 10; } var example_2 = function() { something.click(function(){ var something_3 = function() { alert(row);
var example_1 = function() {
row = 10;
}
var example_2 = function() {
something.click(function(){
var something_3 = function() {
alert(row);
}
something_3();
}
}
问题是,在something_3函数中无法访问row变量。我在example_2函数中访问example_1函数中的其他变量,但是当放入something_3函数时,它就不再工作了。谢谢你的帮助
编辑:添加额外的代码以显示哪些有效,哪些无效。行在构建功能中定义为board和Mine。可以访问Board和Mine,但row无法访问
var build = function(row) {
row = typeof row !== 'undefined' ? row : 5;
board = $('.container');
mines = [1,2,3,4];
}
build();
var start = function() {
var tile = $('.container div');
tile.click(function() {
var this_index = $(this).index();
var has_mine = $.inArray(this_index, mines);
var scan = function() {
alert(row);
}
if (has_mine > -1) {
add_alert("Has mine, you're dead!");
} else {
scan();
$(this).html('Clear!');
}
});
var add_alert = function(msg) {
board.append("<span class='alert'>" + msg + "</span>")
$('body').append("<div class='blackout'></div>");
}
}
start();
多个问题:
如果不在函数中的变量前面指定var,它将成为全局变量
行没有初始化,因为您没有调用示例_1;然而
在一个不相关的注释中,不要忘记在匿名函数的末尾使用分号,因为它可能被解释为自动执行函数。
编辑2:
好的,问题是行变量是一个参数,所以不再是全局变量。如果删除传递给生成方法的行参数/更新变量名,它将起作用
var build = function(row) {
row = typeof row !== 'undefined' ? row : 5;
//[...]
}
ROW未定义为变量,而是一个参数。这样,它就不会作为全局变量泄漏
只需更改参数的名称即可:
var build = function(rowValue) {
row = typeof rowValue !== 'undefined' ? rowValue: 5;
//[...]
}
然而,您不应该使用隐式全局变量。全局变量已经够糟糕的了
选项一,声明变量:
var row, board, mines;
var build = function(rowValue) {
row = typeof rowValue !== 'undefined' ? rowValue : 5;
board = $('.container');
mines = [1,2,3,4];
}
选项二,使用全局标识符:
var build = function(row) {
window.row = typeof row !== 'undefined' ? row : 5;
window.board = $('.container');
window.mines = [1,2,3,4];
}
你能加一把小提琴来演示你的问题吗?如果没有完整的代码,我们所能做的就是猜测。我的猜测是,您已经在示例_1函数之外声明了行,可能是全局的,这使得示例_3可以访问它。您的其他变量可能在示例_1中声明,因此不可访问。如果没有完整的代码,很难说。这里有一个关于作用域的简短说明:您的行变量被声明为全局变量。它应该能够在示例_1之外访问,但使用隐式声明的全局变量非常糟糕。添加了更多代码,希望这能有所帮助。我的示例有点差,所以我提供了一些代码,对此表示抱歉。没问题-只是确保我们不使用错误的做法,因为这会导致更多问题而不是方便。当然,我不知道匿名函数末尾的分号,所以我很感激!关于行是导致问题的参数,您也是对的,我有一种感觉,可能是这样,但试图以错误的方式解决它。这解决了我的问题,非常有用,谢谢!
var build = function(row) {
window.row = typeof row !== 'undefined' ? row : 5;
window.board = $('.container');
window.mines = [1,2,3,4];
}