将外部参数获取到匿名函数jQuery中

将外部参数获取到匿名函数jQuery中,jquery,scope,closures,parameter-passing,anonymous-function,Jquery,Scope,Closures,Parameter Passing,Anonymous Function,我正在开发一个函数,该函数将返回一个上下文菜单,以便在jsTree中使用http://www.jstree.com/documentation/contextmenu 上下文在设置上下文菜单对象时,我需要以某种方式将一些变量放入对集成插件中另一个函数的包装调用中 小提琴在这里,代码如下: $(document).ready(function() { var treeDef = { "rateComponentGroup": { title: "R

我正在开发一个函数,该函数将返回一个上下文菜单,以便在jsTree中使用http://www.jstree.com/documentation/contextmenu 上下文在设置上下文菜单对象时,我需要以某种方式将一些变量放入对集成插件中另一个函数的包装调用中

小提琴在这里,代码如下:

$(document).ready(function() {

    var treeDef = {
        "rateComponentGroup": {
            title: "Rate Component Group",
            entity: "rateComponentGroup",
            contextMenu: [
                {label: "New...", action: "new", entity: "rateComponentGroup"},
                {label: "Delete...", action: "confirmdelete", entity: "rateComponentGroup"}
            ]
        }

    }

    var clickedNode = "rateComponentGroup";

    if (treeDef[ clickedNode ]) { // do we have setup for this node?

        cntxtMenu = treeDef[ clickedNode ].contextMenu;

        if (cntxtMenu instanceof Array) {

            var menu = {};

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

                // append msg to html to see what we're doing
                $("#message").append(cntxtMenu[i].label + cntxtMenu[i].action + "<br/>");

                // define each context menu item label and action
                menu[i] = {
                    label: cntxtMenu[i].label,
                    action: function() {
                        // 
                        // how to get cntxtMenu[i].label and cntxtMenu[i].action in here?
                        // 
                    }
                }

            }

        }

        // in larger context this block simply returns an object defining a context menu for jsTree
        //    containing a label and an action method to fire when selected
        //    see: http://www.jstree.com/documentation/contextmenu
        // return menu;

    }

});

您可以将这些对象的值复制到菜单[]数组中的对象中。然后在action函数中使用它们的值

// append msg to html to see what we're doing
$("#message").append(cntxtMenu[i].label + cntxtMenu[i].action + "<br/>");
// define each context menu item label and action
menu[i] = {
   label: cntxtMenu[i].label,
   cntxtAct: cntxtMenu[i].action,
   action: function() {
      // just use the copies in here
      alert(this.label + '\n' + this.cntxtAct);
   }
}

工作示例@

我希望如此……但正如我在这里尝试的那样,调用为某个操作定义的函数会导致错误,即ctxtMenu未定义……编辑:使用新的解决方案编辑主帖子,在这些变量在范围内时存储这些变量的值,然后您可以稍后引用副本。感谢您的洞察力。这在我更大的插件上下文中不起作用,但它使我不得不提出这个问题,这与cntxtMenu[i]符号有关。当我简单地为action和entity设置显式变量,而不是在带有索引的数组中引用它们时,它就起作用了。