Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量范围-jQuery/JavaScript_Javascript_Jquery_Variables_Scope - Fatal编程技术网

变量范围-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);

我在jQuery/JavaScript中的变量范围方面遇到了一些问题。我将只给出一个代码示例来演示我的问题,因为它可能比试图用文字解释更容易理解

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]; 
}