1

私が持っているのはそのようなものです:

jQuery(function($) {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }
[...]

App.init();別のファイルから呼び出そうとすると、 App is not defined.

ジャスミンでテストを作成しようとしていますが、同じエラーが発生しました。

外部ファイルから、単純な関数内にネストされたこの「リテラルクラス」内に移動するにはどうすればよいですか?

4

3 に答える 3

4

グローバルとして公開されていない場合は、触れることはできません。

グローバルスコープにある名前空間に配置する必要があります。

jQuery(function($) {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }

  }

  if (!window.myNamespace) {
      window.myNamespace = {};
  }
  myNamespace.App = App;


});

ここで面白いのは、document.ready になるまで存在しないということです。ready でラップする理由がわかりません。init 呼び出しは、準備完了時に呼び出す必要があります。したがって、どのウィジェットが最初に登録されるかについて競合状態が発生することになります。

于 2013-03-05T13:57:28.400 に答える
4

Javascript には関数スコープがあります。つまり、関数内で定義された変数は、その関数内でのみ表示されます。関数の外部からこの変数にアクセスするには、関数の外部で宣言するか、ウィンドウまたは他のグローバル オブジェクトに直接アタッチするか、関数から値として返す必要があります。

外部で宣言する:

var App;
    jQuery(function($) {

  'use strict';

  App = {

    init: function() {
      App.startTool();
    }
[...]

ウィンドウまたはその他のグローバル名前空間へのアタッチ:

    jQuery(function($) {

  'use strict';

  window.App = {  //or namespace.App where namespace can be another global variable.

    init: function() {
      App.startTool();
    }
[...]

あなたがそれをラップしている方法では、値を返すことはできませんが、それが別の関数であれば、これを行うことができます:

var App= (function() {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }
return App;
}())

関数スコープについてもう少し: 関数内で宣言された変数は、その関数の外から見ることはできません。関数外で宣言された変数は、関数内から見ることができます。したがって、オブジェクトをグローバルにしたい場合は、関数の外側で宣言するか、関数の外側で既に宣言されているもののプロパティとして設定する必要があります。ブラウザでは、window オブジェクトはデフォルトでグローバルです。nodejs や rhino などの他の環境には、独自のグローバル オブジェクトがあります。

JS スコープがどのように機能するかを理解することは重要です。なぜなら、JS スコープは言語の多くのより強力な機能、特にクロージャーとモジュール パターンの背後にある基盤だからです。

名前空間の利点について言及している人もいます。これは、このコンテキストの良い点です。ライブラリまたはアプリケーションに対して 1 つのグローバル変数を使用すると、使用している可能性のある他のライブラリまたはスクリプトとの競合を回避できます。次に、他の変数をそのグローバル名前空間変数にアタッチし、それらをそのオブジェクトのプロパティとして参照できます。App.initしたがって、直接呼び出す代わりにmyProgram.App.init()、たとえば呼び出します。

于 2013-03-05T13:58:12.283 に答える
0

App関数の外部から使用する場合は、グローバルに使用できるようにする必要があります。

jQuery(function($) {
    'use strict';

    // attach it to window instead of using var
    window.App = {
        init: function() {
            App.startTool();
        }
    };
});
于 2013-03-05T13:58:02.520 に答える