1

我将所有函数都包装在一个立即调用的函数表达式中,如下所示:

(function(){
  "use strict";

  function toggleComment(parentCommentID) {
    $("form#" + parentCommentID).toggle();
  }

  function scrollBottom() {
    window.scrollTo(0, document.body.scrollHeight);
  }

})();

但是,在通过链接调用这些函数之一时:

<a href="javascript:void(0)" onclick="toggleComment(159); return false;">Reply</a>

Chrome 控制台输出Uncaught ReferenceError: toggleComment is not defined. 我是否错误地认为立即调用的函数表达式,顾名思义,应该立即被调用,因此toggleComment应该被调用?我应该以不同的方式调用该函数吗?

4

3 回答 3

5

该功能toggleComment不可见。它包含在您正在使用的 ready 函数中;如果您希望能够这样调用它(在大多数情况下不建议这样做),您必须将其提升到该函数之外并使其全局可访问。

而这与strict. 如果删除该strict行,此问题仍然相同。

于 2012-07-27T21:13:24.317 回答
2

这些函数不再在全局范围内声明。尝试

window.toggleComment = function(parentCommentID) {
  $("form#" + parentCommentID).toggle();
};
于 2012-07-27T21:14:34.803 回答
1

您已经在闭包中声明了函数。它们超出了 HTML 标记的范围。

您可以为您的<a>标签设置一个 id 并将您的函数发布到全局范围,因此您可以这样做:

(function(){
  "use strict";

  var toggleComment = function(parentCommentID) {
    $("form#" + parentCommentID).toggle();
  }

  function scrollBottom() {
    window.scrollTo(0, document.body.scrollHeight);
  }

  document.getElementById("yourATagId").onclick(function() {
    toggleComment(159);
  });

  window.toggleComment = toggleComment;
})();

也许您可以从这个简单的单例模式中受益:

(function() {
    var controller = {};

    controller = new function() {
        this.sampleProperty = "my property";
    }

    controller.yourFunction = function() {
        var localVariable;
        console.log("I can access " + this.property);
    };

    window.controller = controller;
})();

这样,controller您的全局范围就会知道。

于 2012-07-27T21:27:22.480 回答