javascript - 从另一个函数读取一个函数

标签 javascript jquery

当我点击 .test 时它不执行 do_alert(); 函数并给我一个错误的问题:

do_alert(); is not defined.

有什么问题?当页面加载时,主函数 helpers 已经被读取 为什么不能从 logout_users 函数中获取这个函数?

var setup_system = (function($) {
  "use strict";

  return {
    init: function() {
      this.logout_users();
      this.helpers();
    },
    logout_users: function() {
      $(document).on('click', '.test', function(e) {
        e.preventDefault();
        do_alert();
      });
    },
    helpers: function() {
      function do_alert() {
        alert();
      }
    }
  };
})(jQuery);

jQuery(document).ready(function() {
  setup_system.init();
});

注意:我尝试通过在 logout_users 函数中添加 this.helpers() 来重新读取 helpers 函数,但没有任何变化。

最佳答案

这是因为您在helpers 函数的范围内定义了do_alert()

要解决此问题,您需要将该函数移动到您返回的对象的范围内。您可以将它放在对象的根级别(这样可以正常工作,但如果您有很多“辅助”函数,可能会变得困惑)或者您可以将它嵌套在您的 helpers 属性中,如果您将其定义为另一个对象。就个人而言,我会使用后者来进行一些组织。试试这个:

var setup_system = (function($) {
  "use strict";

  return {
    init: function() {
      this.logout_users();
    },
    logout_users: function() {
      var _obj = this;
      $(document).on('click', '.test', function(e) {
        e.preventDefault();
        _obj.helpers.do_alert();
      });
    },
    helpers: {
      do_alert: function() {
        alert('foo');
      }
    }
  };
})(jQuery);

jQuery(function() {
  setup_system.init();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="test">Click me</div>

请注意,我在 click 处理程序之外缓存了对对象的引用作为 _obj,因为在该 block 中 this 将引用单击 .test 元素。

关于javascript - 从另一个函数读取一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750352/

相关文章:

javascript - 当我编辑时在 Material 表中渲染一个开关按钮

javascript - Flexslider:在自定义按钮单击时移动到下一张幻灯片(有延迟)

javascript - jQuery用表单包装div而不提交

javascript - 将标签作为文本附加到文本区域

javascript - 在手动结束 JavaScript 函数之前,我应该让它运行多长时间?

javascript - OpenLayers 和 GeoJSON,不在同一坐标上乘以标记

javascript - 处理字段中带有换行符的 csv 文件 - node.js

php - 每当 php/codeigniter 中的数据库中有添加时创建实时监听器

javascript - jQuery ajax 基本身份验证不起作用

javascript - 何时使用 ES2017 内置的 'async' 或导入 'npm i async'