Javascript 数组变量在循环中丢失

标签 javascript variables loops tinymce

<分区>

所以我试图在 wordpress 上的 tinyMCE 所见即所得编辑器中添加额外的按钮。他们出现并正在运作(某种程度上)。单击时,它们只是输出数组中的最后一个变量,这很奇怪,因为我在循环的其他地方使用了该变量并且它工作正常。

(function() {
  tinymce.create('tinymce.plugins.col', {
    init : function(ed, url) {
      var col_id = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven'];
      for(var i = 0; i < col_id.length; i++){
        var colNum = col_id[i];
        ed.addButton(colNum+'_col', {
          title : colNum+' Column',
          image : url+'/images/mce/'+colNum+'.png',
          onclick : function() {
            ed.selection.setContent('['+colNum+'_col]' + ed.selection.getContent() + '[/'+colNum+'_col]');
           }
         }); // ***** Col *****
         ed.addButton(colNum+'_col_first', {
           title : colNum+' Column First',
           image : url+'/images/mce/'+colNum+'.png',
           onclick : function() {
             ed.selection.setContent('['+colNum+'_col_first]' + ed.selection.getContent() + '[/'+colNum+'_col_first]');
            }
          });  // ******  Col First ******
          ed.addButton(colNum+'_col_last', {
            title : colNum+' Column Last',
            image : url+'/images/mce/'+colNum+'.png',
            onclick : function() {
              ed.selection.setContent('['+colNum+'_col_last]' + ed.selection.getContent() + '[/'+colNum+'_col_last]');
            }
          });   //*********  Col Last **********
        }
      },
      createControl : function(n, cm) {
        return null;
      },
    });
    tinymce.PluginManager.add('col', tinymce.plugins.col);
  })();

当我点击其中一个按钮时,它会输出 [eleven_col][/eleven_col] 的短代码,这让我很困惑,因为标题和图像 url 输出正确。

最佳答案

我认为这是经典的闭包问题,希望可以在这里得到解释:JavaScript closure inside loops – simple practical example

将所有内容包装在 for 循环中:

(function (colNum) {
    // Your code in the for loop
})(col_id[i]);

并删除你的 var colNum = col_id[i];

所以最终的代码看起来是这样的:

(function() {
    tinymce.create('tinymce.plugins.col', {
        init : function(ed, url) {
            var col_id = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven'];
            for(var i = 0; i < col_id.length; i++){
                (function (colNum) {    // <---------------------- ADDED THIS
                    ed.addButton(colNum+'_col', {
                        title : colNum+' Column',
                        image : url+'/images/mce/'+colNum+'.png',
                        onclick : function() {
                            ed.selection.setContent('['+colNum+'_col]' + ed.selection.getContent() + '[/'+colNum+'_col]');

                        }
                    }); // ***** Col *****

                    ed.addButton(colNum+'_col_first', {
                        title : colNum+' Column First',
                        image : url+'/images/mce/'+colNum+'.png',
                        onclick : function() {
                            ed.selection.setContent('['+colNum+'_col_first]' + ed.selection.getContent() + '[/'+colNum+'_col_first]');

                        }
                    });  // ******  Col First ******

                    ed.addButton(colNum+'_col_last', {
                        title : colNum+' Column Last',
                        image : url+'/images/mce/'+colNum+'.png',
                        onclick : function() {
                            ed.selection.setContent('['+colNum+'_col_last]' + ed.selection.getContent() + '[/'+colNum+'_col_last]');

                        }
                    });   //*********  Col Last **********
                })(col_id[i]);    // <------------------------- ADDED THIS
            }
        },
        createControl : function(n, cm) {
            return null;
        }
    });
    tinymce.PluginManager.add('col', tinymce.plugins.col);
})();

关于Javascript 数组变量在循环中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841306/

相关文章:

javascript - 根据持续时间计算月份和年份

javascript - 循环访问页面链接 puppeteer 不会从新加载的页面返回值

php - PHP 中的 $x+++$X++ 是什么? increment 的异常使用

C++ 在最后一个循环中排除部分循环运算符

C++ for循环奇怪的行为

php - 如何使用特定于最后一行的条件回显循环中的特定数据

javascript - 魔线响应JQuery

javascript - 如何通过 jQuery AJAX 从使用 OAuth 1.0 身份验证的 Upwork API 请求 JSONP 文件?

c++ - 使用堆在堆栈中设置值

azure - 在 Foreach 内部 append 变量 : Azure data factory