【问题标题】:Variable Scope - jQuery/JavaScript变量范围 - jQuery/JavaScript
【发布时间】:2014-08-15 19:27:58
【问题描述】:

我在使用 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 函数中定义,就像 board 和 mines 一样。板和地雷可以访问,但行不能。

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();

【问题讨论】:

  • 你能添加一个小提琴来展示你的问题吗?你的其他变量也是如此。
  • 没有完整的代码,我们只能猜测。我的猜测是,您在 example_1 函数(可能是全局的)之外声明了行,使得 example_3 可以访问它。您的其他变量可能在 example_1 中声明,因此无法访问。
  • 没有完整的代码,很难说。这是关于范围的有用简短说明:stackoverflow.com/questions/500431/…
  • 您的 row 变量被声明为全局变量。应该可以在example_1之外访问,但是使用隐式声明的全局变量是很糟糕的。
  • 添加了更多代码,希望对您有所帮助。

标签: javascript jquery variables scope


【解决方案1】:
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]; 
}

【讨论】:

  • 这解决了我的问题,而且信息量很大,谢谢!
【解决方案2】:

多个问题:

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

编辑 2:

var build = function(row) {};

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

【讨论】:

  • 我的例子有点糟糕,所以我提供了一些代码,对此感到抱歉。
  • 没问题 - 只要确保我们不使用不良做法,因为它带来的问题多于便利。
  • 当然,不知道匿名函数末尾的分号,所以我很感激!您对 row 是导致问题的参数也是正确的,我有一种感觉可能是这样,但试图以错误的方式修复它。
猜你喜欢
  • 2011-05-26
  • 2015-12-25
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多