变量作用域- jQuery/JavaScript

Variable Scope - jQuery/JavaScript

本文关键字:JavaScript jQuery 作用域 变量      更新时间:2023-09-26

我在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函数内访问。我在example_2函数中访问了example_1函数中的其他变量,但是当放入something_3函数时,它不再工作。谢谢你的帮助!

编辑:添加了额外的代码来显示什么是有效的,什么是无效的。行是在Build函数中定义的,板和矿也是如此。棋盘和地雷可以进入,但行不能。
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 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]; 
}

多重问题:

  • 如果你没有在函数的变量前面指定var,它就会变成一个全局变量
  • row没有被初始化,因为你没有调用example_1();然而,
  • 在一个无关的注释中,不要忘记在匿名函数的末尾使用分号,因为它可能被解释为自执行函数。

编辑2:

var build = function(row) {};

好的,所以你的问题是变量是一个参数,所以不再是一个全局变量了。如果您删除传递给构建方法的行参数/更新变量名称,它将工作。