将函数作为对象传递的Javascript会影响作用域

Javascript passing function as object affects scope

本文关键字:Javascript 影响 作用域 函数 对象      更新时间:2023-09-26

我正在传递一个函数作为参数,并且我正在失去某些对象的作用域,除非该对象在全局作用域中。我想从全局范围中删除该对象。

这里aliasGrid在全局范围内,我不希望它是全局的。但是如果我移除它的全局作用域,我无法在下的deleteAliasName()函数中访问它。

全球范围声明

aliasGrid = new AliasGrid();
aliasGrid.initialize();

问题是在showConfirmationDialog('deleteAliasName', 'noResponseConfirmationDialog',aliasNotificationLabel);中,我将两个函数的名称作为字符串传递,然后当在确认对话框上单击"yes"answers"no'"按钮时,它们是可执行的。

这很好,但我希望deleteAliasName()是AliasGrid函数的一个属性,并在showConfirmationDialog('deleteAliasName', 'noResponseConfirmationDialog',aliasNotificationLabel);上作为参数传递,并在单击ComfirmationDialog的"yes"按钮时可执行。

AliasGrid.js

function AliasGrid() {
    var aliasData= [];
    var aliasNotificationLabel = 'Alias Name';  
  return {   
    load: function(){
        //create grid
    },
    add: function(){
        //adds record to grid
    },
    getAliasData: function () {
      return this.aliasData;
    },
    delete: function () {
      try {
        var aliasNameGrid = dijit.byId('aliasNameGrid');
        var deleteAliasNameSelection = aliasNameGrid.selection;
        var deleteAliasNameCount = 0;
        for (var i in deleteAliasNameSelection) {
          deleteAliasNameCount++;        }
        if (deleteAliasNameCount > 0) {                
          showConfirmationDialog('deleteAliasName', 'noResponseConfirmationDialog',aliasNotificationLabel);         
        } else {
          showNotificationDialog('okResponseNotificationDialog', 'Select Record(s) For Deletion !', aliasNotificationLabel);
        }
      } catch (error) {
        showNotificationDialog('okResponseNotificationDialog', error, aliasNotificationLabel);
      }
    }
  };
};

确认对话框

function showConfirmationDialog(yesFunction, noFunction, title) {
  var confirmationDialog = new dijit.Dialog({
    id: 'deleteGridRecordConfirmationId',
    title: "<img src='images/niblogo.png' alt='National Insurance Board'class='loginDialogLogo'/>" + title,
    content: '<table style= "width: 300px;">' + '<tr>' + '<th style="text-align:center; padding: 5px" colspan="2"><label> Are Your Sure ? </label></th>' + '</tr>' +
      '</table>' +
      '<div class="dijitDialogPaneActionBar" style="text-align:center;"><button id= yesBtnId onclick=' + yesFunction + ' >Yes</button><button id=noBtnId onclick=' + noFunction + '("deleteGridRecordConfirmationId")>No</button></div>'
  });
  confirmationDialog.show();
}

删除别名

function deleteAliasName() {
  try {
    var aliasData = aliasGrid.getAliasData();
    var aliasStore = new dojo.store.Observable(new dojo.store.Memory({
      data: aliasData,
      idProperty: "id"
    }));
    var grid = dijit.byId('aliasNameGrid');
    aliasStore.query({}).forEach(function (AliasName) {
      if (grid.selection[AliasName.id]) {
        aliasStore.remove(AliasName.id);
      }
    });
function showConfirmationDialog(yesFunction, noFunction, title) {
    var confirmationDialog = new dijit.Dialog({
        id: 'deleteGridRecordConfirmationId',
        title: "<img src='images/niblogo.png' alt='National Insurance Board'class='loginDialogLogo'/>" + title,
        content: '<table style= "width: 300px;">' + '<tr>' + '<th style="text-align:center; padding: 5px" colspan="2"><label> Are Your Sure ? </label></th>' + '</tr>' +
        '</table>' +
        '<div class="dijitDialogPaneActionBar" style="text-align:center;"><button id="yesBtnId">Yes</button><button id="noBtnId">No</button></div>'
    });
    var dijitDialog = $("div.dijitDialogPaneActionBar");
    dijitDialog.children("button#yesBtnId").click(yesFunction);
    dijitDialog.children("button#noBtnId").click(function()
    {
        noFunction("deleteGridRecordConfirmationId");    
    });
    confirmationDialog.show();
}

别名网格:

function AliasGrid()
{
    var aliasData= [];
    var aliasNotificationLabel = 'Alias Name';
    var self = this;
    self.deleteAliasName = function() {
        try {
            var aliasData = self.getAliasData();
            var aliasStore = new dojo.store.Observable(new dojo.store.Memory({
                data: aliasData,
                idProperty: "id"
            }));
            var grid = dijit.byId('aliasNameGrid');
            aliasStore.query({}).forEach(function (AliasName) {
                if (grid.selection[AliasName.id]) {
                    aliasStore.remove(AliasName.id);
                }
            });
        }
    };
    return {
        load: function(){
            //create grid
        },
        add: function(){
            //adds record to grid
        },
        delete: function () {
            try {
                var aliasNameGrid = dijit.byId('aliasNameGrid');
                var deleteAliasNameSelection = aliasNameGrid.selection;
                var deleteAliasNameCount = 0;
                for (var i in deleteAliasNameSelection) {
                    deleteAliasNameCount++;        }
                if (deleteAliasNameCount > 0) {
                    showConfirmationDialog(self.deleteAliasName, 'noResponseConfirmationDialog',aliasNotificationLabel);
                } else {
                    showNotificationDialog(okResponseNotificationDialog, 'Select Record(s) For Deletion !', aliasNotificationLabel);
                }
            } catch (error) {
                showNotificationDialog(okResponseNotificationDialog, error, aliasNotificationLabel);
            }
        }
    };
};