【问题标题】:Why doesn't my code append to the string within the loop?为什么我的代码没有附加到循环中的字符串?
【发布时间】:2010-11-28 23:14:04
【问题描述】:

我正在使用 jQuery,通过循环构建表格。我认为最好的方法是创建一个数组然后执行$(blah).html(table);

var settings_table = '<open the table>';
  $.each(settings, function(i, val){
    var settings_table = settings_table+'<put stuff in it>';
  });
  var settings_table = settings_table+'<close it>';
  $('#rscc_opts').html(settings_table);

但这不起作用。我假设我做错了。或者您能提出更好的解决方案吗?我的数组形成如下:

var settings = [
  {
    var1: 'foo',
    var2: 'foo',
  },
  {
    var1: 'foo',
    var2: 'foo',
  }
];

【问题讨论】:

标签: javascript jquery arrays loops


【解决方案1】:

这里的主要问题。

每次你说“var settings_table”时,你都会隐藏变量。除了 settings_table 的第一个声明之外,去掉所有的“var”关键字。

【讨论】:

  • 谢谢。不知道它会覆盖它。认为它可能像 PHP 一样工作。
  • @Ben 这很棘手,因为即使代码看起来与您可能在 PHP 中执行的代码相似,但实际上却完全不同。在 PHP 中,您正在做一些更类似于 for(int i =0; i 自己的变量。因此,当您说“var settings_table”时,该变量完全独立于上述变量。你没有“覆盖”它。
  • 并非如此。变量声明一次,在进入函数的执行上下文时和在函数体中的任何其他语句被评估之前。 Fwiw,函数声明在同一时间被实例化,也在实际评估之前。稍后,在循环期间,只有一个分配正在进行。
  • @kangax 但是通过在匿名函数上重新使用“var”声明,您实际上不是为该函数创建了一个范围变量,因此覆盖了对封闭变量的可见性吗?跨度>
  • @Matt 绝对是的。在这种情况下,内部settings_table 遮住了外部。我只想解释仅仅出现var(在块中)并没有声明变量;并且变量总是为函数执行声明一次;)
【解决方案2】:

扩展 iftrue 的答案:

第一次声明变量时,如果没有指定“var”,则说明它是一个全局变量。

如果您使用“var”关键字,则该变量将“作用于”该特定函数。这意味着它的数据只能由该函数内的代码访问。这意味着该函数之外的任何内容都无法访问该变量。另一个函数可以定义同名的同一个变量,它可以存储完全不同的值。

$.each(settings, function(i, val){
  var settings_table = settings_table+'<put stuff in it>';
});

这里的诀窍是您要定义一个新的匿名函数以供迭代器使用。这个函数有它自己的范围(它自己的个人数据)。这意味着通过声明“var settings_table”,您是在说“创建一个特定于该函数的全新变量”。因此,您实际上所做的是将表数据分配给一个全新的变量,然后在循环的下一次迭代中丢失数据。如果我们将其重写为:

function BuildTable(i, val){
  var settings_table = settings_table+'<put stuff in it>';
}

$.each(settings, BuildTable);

你真正想做的是一些可能有点棘手的事情,它被称为“关闭”。闭包是一个高级的 javascript 主题。但是,从本质上讲,您所做的是在说“嘿,我想让这个匿名函数访问我的个人数据”

在你的情况下,你想做的是:

var settings_table = '<open the table>';
$.each(settings, function(i, val){
  settings_table = settings_table+'<put stuff in it>';
});

settings_table = settings_table+'<close it>';
$('#rscc_opts').html(settings_table);

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-04-30
    相关资源
    最近更新 更多