如何在 javascript 中使用外部值在 js 中使对象循环?

How to make object in loop in js with external value in javascript?

我想动态创建一个 jqgrid 列。但是我遇到了一个问题 "closure on a variable modified in loop of outer scope"。这是我的函数,return jqgrid 的 colModel。

 var getJqgridColModel = function () {
            var colModel = [
            ];
           //Here i am making the column
            if (args && args.colModel) {

                for (var i = 0; i < args.colModel.length; i++) {

                    var col = {
                        name: "action",
                        width: "100",
                        sortable: false,
                        hidden: false,

                        formatter: function(cellValue, options, rowObject) {
                            var markup = "<a class=\"jqGrid-Column-Text\" title=\"%ToolTip%\" href=%Href%;>%Text%</a>";
                            var replacements = {
//Here is problem
                                "%Text%": args.colModel[i].actionLink,//Problem occures here.This "args.colModel[i].actionLink" is not recoginize.It shows "closure on a variable modified in loop of outer scope"
                                "%ToolTip%": "//",
                                "%Href%": "javascript:PersonSearch.perfomeActionOnSelect(" + rowObject.PersonLog.PersonId + ")"
                            };

                            markup = markup.replace(/%\w+%/g, function(all) {
                                return replacements[all];
                            });
                            return markup;
                        }
                    };
                    colModel.push(col);
                }

            }

            return colModel;
        }

我该如何解决这个问题?

您的原始示例不起作用的原因是您在循环中创建的所有闭包都引用了同一帧。

    var getJqgridColModel = function () {
    var colModel = [];
    //Here i am making the column
    if (args && args.colModel) {
                for (var i = 0; i < args.colModel.length; i++) {

                    var col = {
                        name: "action",
                        width: "100",
                        sortable: false,
                        hidden: false,

                        formatter: (function(i){
                            return function(cellValue, options, rowObject) {
                                var markup = "<a class=\"jqGrid-Column-Text\" title=\"%ToolTip%\" href=%Href%;>%Text%</a>";
                                var replacements = {
                                    //Here is problem
                                    "%Text%": args.colModel[i].actionLink,//Problem occures here.This "args.colModel[i].actionLink" is not recoginize.It shows "closure on a variable modified in loop of outer scope"
                                    "%ToolTip%": "//",
                                    "%Href%": "javascript:PersonSearch.perfomeActionOnSelect(" + rowObject.PersonLog.PersonId + ")"
                                };

                                markup = markup.replace(/%\w+%/g, function(all) {
                                        return replacements[all];
                                });
                                return markup;
                            }
                        }(i));
                    };
                    colModel.push(col);
                }

        }

        return colModel;
}