1

次のように、すべての関数をすぐに呼び出される関数式にラップしました。

(function(){
  "use strict";

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

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

})();

ただし、リンクを介してこれらの関数の1つを呼び出すと、次のようになります。

<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 タグの範囲外です。

タグに id を設定する<a>だけでなく、関数をグローバル スコープに公開することもできるので、次のようにすることができます。

(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 に答える