在$('document')中调用一个函数。准备好了

时间:2012-02-13 22:51:21

标签: javascript ajax pjax

我在$('document').ready内定义了一个函数。

$('document').ready(function() {
  function visit(url) {
    $.ajax({
      url: url,
      container: '#maincontainer',
      success: function(data) {
        init();
      }
    });
  }

  function init() {
    ...
  }
)};

但是当我在Chrome控制台中拨打init()时,我得到:ReferenceError: init is not defined

更新:谢谢大家的帮助。我做了window.init = init;并且效果很好。

5 个答案:

答案 0 :(得分:3)

您的init函数包含在您传递给jQuery.ready的函数范围内。这是一个好东西,这意味着你没有创建一个不必要的全局。

如果需要将函数导出到全局范围,可以通过显式分配window上的属性来实现,例如:

window.init = init;

由于window是浏览器上的global object,因此您可以在Chrome控制台中调用它而不使用window.前缀。但只有在绝对必要时才这样做,全球范围已经足够拥挤。

答案 1 :(得分:1)

函数声明(如function init() {})仅限于它们定义的范围。如果要在其他地方使用init,请执行以下操作:

var init;
$('document').ready(function() {
    init = function() {};
});

答案 2 :(得分:0)

尝试这样的事情:

$('document').ready(function() {

  var objScope = this;

  function visit(url) {
    $.pjax({
      url: url,
      container: '#maincontainer',
      success: function(data) {
        objScope.init();
      }
    });
  }

  function init() {
    ...
  }
)};

答案 3 :(得分:0)

我认为您希望将函数定义放在ready函数之外,即使函数引用文档,也不需要文档准备好定义函数。保持在我的函数中,函数内部的引用在函数实际执行之前不会执行,函数定义就像定义文本常量一样。请改用以下内容:

function visit(url) {
    $.pjax({
        url: url,
        container: '#maincontainer',
        success: function(data) {
        init();
        }
    });
}

function init() {
    ...
}

$(function () {
    init();
});

答案 4 :(得分:-1)

函数仅定义您在其中定义的范围。

如果您坚持使用此方法,请改用init = funciton()语法。这将创建一个全局变量(因为你不会在那里放置var)可以在任何地方引用。

也就是说,定义函数可以随时完成,将它们放入.ready()绝对没有意义。