3

したがって、これは私がはるかに強力なコンテキストでJavascriptを使用するのは初めてであり、シッククライアントを使用し、javascript自体を介して多くの手間のかかる作業を行います。私はjQueryを使用していますが、現時点では多くのコードが泥だらけになっています。これはすべて単なる関数の集まりです。

私の関数のいくつかについては、変数を複数の関数に渡して、その値を維持する必要がありました。これを行うための明白な方法は、関数のスコープ外でそれらを宣言し、関数に本来の方法で操作させることです。(これらの変数はオブジェクトであり、プリミティブ型ではないため、JavaScriptが参照によって渡されると思いますが、これは機能します)。

たとえば、私はおそらくこのようなものを持っています

var node = //init with some value;

$(document).ready(setup);
function setup()
{
 A();
 B();
}

function A()
{
  // operate on var node
}

function B()
{
  // operate on var node
}

これは明らかに私のコードの縮小版ですが、グローバル変数を処理する方法をキャプチャしています。私の質問は、上記を行うためのよりエレガントな方法はありますか?

ありがとう

4

6 に答える 6

4

できない理由:

$(document).ready(function() {
    var node = //init with some value;
    setup(node);

    function setup(node) {
        A(node);
        B(node);
    }

    function A(node) {
      // operate on var node
    }

    function B(node) {
      // operate on var node
    }
});

一般に、グローバル変数と関数を使用することは悪い考えであり、可能な限り避けるべきです。

于 2012-12-18T18:58:19.217 に答える
4

について具体的に質問しているように見えますがnode、関数setupAおよびBは、バージョンのすべてのグローバル変数で もあることに注意してください。

最も簡単な方法は、これらすべての宣言を無名関数内に配置することです。

$(document).ready(function() {

    var node = ...;

    function A() {
        ...
    }

    function B() {
        ...
    }

    function setup() {
        A();
        B();
    }

    setup();
});
于 2012-12-18T19:00:42.940 に答える
2

グローバル変数は 1 つだけ (またはできるだけ少なく) 使用してください。1 つのグローバル変数の関数またはオブジェクトのメンバーを作成します。

ダグラス・クロックフォード 言う

JavaScript プログラムの品質の客観的な尺度は、いくつのグローバル変数とグローバル関数がありますか? 他のプログラムとの不適切な相互作用の可能性が高くなるため、多数は不適切です。理想的には、アプリケーション、ライブラリ、コンポーネント、またはウィジェットは、単一のグローバル変数のみを定義します。その変数は、すべてのもののルート名前空間を含むオブジェクトである必要があります。

Yahoo のシングル グローバルは YAHOO です。すべての小文字は通常の文字であり、最初の大文字はコンストラクターを示すため、特別なものであることを識別するためにすべて大文字で綴られています。すべて大文字であるため、誰かが誤って使用する可能性は低く、衝突の可能性がさらに低くなります。

http://www.yuiblog.com/blog/2006/06/01/global-domination/

また、オブジェクトを作成してコードをさらに整理することもできます。

GLOBAL.myObject = {}; GLOBAL.myObject.myFunction = ...

于 2012-12-18T19:00:41.013 に答える
2

私は「公開モジュール」パターンを好みます:

var myApp = (function () {
    // privates
    var node;

    var a = function () {
        // operate on node
    };

    var b = function () {
        // operate on node
    };

    // publics
    var init = function () {
        // initialization stuff
        a();
        b();
    };

    return {
        init: init
    };
})();

$(document).ready(function () {
    myApp.init();
});

myAppこのようにして、アプリが必要とする他のすべてのものを格納する1 つのグローバルのみが存在するようになります。

于 2012-12-18T19:02:15.590 に答える
1

コードが理解しにくくなると思います。むしろ、変数を引数として受け取り、それを戻り値として使用したいと思います。

$(function(){
    var outcome = multiply(add(5));
});

function add(num)
{
    return num+1;
}

function multiply(num)
{
    return num*5;
}

グローバル変数をクロージャーでラップして、実際にはグローバルスコープに移動しないようにしたい場合。

つまり、

(function(){
    var a; // can be used in any functions within this closure, but not polluting window
    function A()
    {
        a = 'blah';
    }
})();
于 2012-12-18T18:59:50.590 に答える
0

沢山あります。たとえば、オブジェクト。

// jQuery shorthand for "wait till DOM ready"
$( function() {
   // create node object
   var node = {
      id: /* some value */,
      setup: function() {
         this.A();
         this.B();
      },
      A: function() {
         // operate on this.id
      },
      B: function() {
         // operate on this.id
      }
   };
   // setup node object
   node.setup();
} );

グローバル変数は、発生するのを待っている問題です。グローバル名前空間を汚さないでください。Javascript はオブジェクト指向言語であり、オブジェクトを使用します。thisオブジェクトには、オブジェクト メソッド内からキーワードを使用して参照できるプロパティがあることに注意してください。

于 2012-12-18T19:03:13.903 に答える