严格模式语句导致函数未定义

时间:2012-07-27 21:10:38

标签: javascript

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

(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?我应该以不同方式调用该函数吗?

3 个答案:

答案 0 :(得分:5)

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

这与strict无关。如果您删除strict行,则此问题仍然相同。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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将为您的全球范围所知。