从另一个函数

时间:2018-02-12 15:50:59

标签: javascript jquery

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

  

do_alert();没有定义。

问题是什么?页面加载时已经读取了主函数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();
});

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

3 个答案:

答案 0 :(得分:3)

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

要解决此问题,您需要将该功能移动到您返回的对象的范围内。您可以将它放在对象的根级别(这可以正常工作,但如果您有很多'帮助'函数可能会变得混乱)或者如果您将其定义为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>
_obj

请注意,我将对象的引用缓存为click处理程序之外的this,因为该块.test将引用所单击的DECLARE @YourValues TABLE(ID INT IDENTITY, SomeVal VARCHAR(100)); INSERT INTO @YourValues VALUES ('FFS1') ,('FFS2') ,('FFS12') ,('FFS1.1') ,('FFS1.2') ,('FFS1.1E') ,('FFS1.1R') ,('FFS12.1') ,('FFS12.2') ,('FFS.12.1E') ,('FFS12.1R') ,('FFS12.2E') ,('FFS12.2R'); 元素。< / p>

答案 1 :(得分:1)

Do_alert函数仅存在于helpers方法中,因此您无法访问它。

您需要直接在logout_user方法或外部声明您的函数,请尝试以下方法:

Brush

答案 2 :(得分:0)

helpers函数调用init时,所发生的一切就是声明了do_alert。但是函数声明被提升到它们的词法范围的顶部。 do_alert的词法范围是helpers函数定义的范围。因此,do_alert功能无法访问helpers

你可以做几件事。首先想到的是:你可以让helpers方法在被返回的对象上定义一个名为do_alert的方法,而不仅仅是声明一个函数,如下所示:

   helpers: function() {
    this.doAlert = function() {
        alert();
    }
}

当传递给jQuery的事件处理程序调用{​​{1}}时,它将无法使用上述解决方案。相反,您需要确保在该事件处理程序中对返回的对象调用doAlert()。这就是你如何做到的:

doAlert