0

次の例で、'z' の宣言によって構文エラーが発生するのはなぜですか?

(function(){ 

    function x(){return 'this is x'}; 
    y = function(){return 'this is y'};

    //z : function(){return 'this is z'};

    alert(x());
    alert(y());
    //alert(z());

})();

http://jsfiddle.net/VXPsd/2/

4

4 に答える 4

3

...「z」の宣言で構文エラーが発生するのはなぜですか?

オブジェクト初期化子の外でプロパティ初期化子構文を使用しているためです。

これは、プロパティ初期化子 (中央の行) を含むオブジェクト初期化子 ( で始まり で{終わるビット) です。}

var obj = {
    propertyName: "property value"
};

したがって、オブジェクトを宣言している場合は、次のz行を ( なしで;)使用できます。

var obj = {
    z: function() { return 'this is z'}
};

しかし、コードにそれがある場合、オブジェクト初期化子ではなく、関数の本体にいます。したがって、その構文は使用できません。

yourxyは互いにまったく異なる構造であることに注意してください。

これ:

function x(){return 'this is x'}; 

は関数宣言です。関数宣言は、含まれている関数のステップバイステップ コードが実行される前に処理され、関数名は含まれている関数の先頭からスコープ内にあります。(これを「巻き上げ」と呼ぶこともあります。)

これ:

y = function(){return 'this is y'};

は関数です。すべての式と同様に、含まれている関数内のコードの段階的な実行で検出された場所で処理されます。

(引用されたコードはThe Horror of Implicit Globals の餌食になります。ところで: varonyがなく、strict モードを使用していないため、その行は というグローバル変数を作成しますy。)

自己実行関数で関数を宣言する正しい方法は何ですか?

どちらのフォーム (xまたはyフォーム) も、他のフォームよりも正確ではありません (暗黙のグローバルなものは別として)。それぞれに用途があり、何をしているかによって異なります。yフォームには、関数が参照する名前がないという問題があります(yこれは無名関数です — 割り当てられた変数には名前がありますが、関数にはありません)。これにより、デバッグがより困難になる可能性があります (ブレークポイントのリストまたはコール スタックを確認する) が、最新のデバッガーは、関数に変数名がない場合でも変数名を表示するのが得意です (可能な場合)。

これらは段階的なコードの一部ではないため、制御構造内で関数宣言を使用できないことに注意してください。

function foo() {
    if (condition) {
        function bar() { /* ...do something... */ }       // <==== WRONG
    }
    else {
        function bar() { /* ...do something else... */ }  // <==== WRONG
    }
}

これが、関数式がある理由の 1 つです。

function foo() {
    var bar;

    if (condition) {
        bar = function() { /* ...do something... */ };       // <==== Right
    }
    else {
        bar = function() { /* ...do something else... */ };  // <==== Right
    }
}

一部の JavaScript エンジンは上記の間違った構文を許容しますが、それを許容する方法はエンジンによって異なります。一部のエンジンは、宣言を式に変換します。他の人は常に 2 番目の宣言を使用します。やらないでください。:-)

そして最後に:名前付き関数式と呼ばれるものもあります:

var x = function foo() { /* ... */ };

関数には名前 ( foo) があり、それを参照する変数には名前 ( x) があります。これは右側の値 ( の右側、イニシャライザ内、引数として関数に渡す場合など) として使用されるため式です。悲しいことに、さまざまな JavaScript エンジンNFE (と呼ばれる) をさまざまな方法で間違って取得しますが、今日の世界では、実際には IE8 以前だけであり、異なるタイミングで 2 つの異なる機能を作成します=:

于 2013-07-02T17:58:45.270 に答える
0

コロン表記は、オブジェクト構文内でのみ機能します。

例えば

var theObj = {one : 'one', two : 'two'};

オブジェクトに追加するには、ドット表記を使用する必要があります。

theObj.three = 'three';
于 2013-07-02T18:03:49.723 に答える
0

実行された匿名関数として (隠蔽あり);

var objOuter = (function(){ // Anonymous Function
    var funcPrivate = function() { 
        // private function contents 
    };
    var funcPublic = function() { 
        // private function contents 
    };

    return { // JavaScript Object
       funcName : funcPublic // provides public access to funcPublic
    };
})();

//objOuter.funcPrivate(); // Failure, private.
//objOuter.funcPublic();  // Failure, internal name for public function.
objOuter.funcName();    // Executes funcPublic in objOuter's scope.

JavaScript オブジェクト定義の一部として (すべて公開):

var objOuter = { // JavaScript Object
   funcName : function() { 
        // function contents 
   }
};

objOuter.funcName();     // Executes funcName

Anonymous Function は JavaScript コードで実行されますが{}、JavaScript オブジェクト定義の内部は、キーと値をペアにする別の種類の構文です。

JavaScript オブジェクト内で、値function()を keyに割り当てますfuncName。そのキーを参照し、引数 list を渡して実行すると()、関数が実行されます。

Anonymous Function ( Revealing Module Patternとも呼ばれます) では、モジュールのスコープ内でプライベート関数を定義し、それらの関数への参照を、返された JavaScript オブジェクトの一部として呼び出し元のコードに渡します。

于 2013-07-02T18:01:47.007 に答える
0

このvariableName : value構文は、オブジェクトのコンテキストでのみ使用できます。例えば:

var obj = {
    z: function(){return 'this is z'};
};

その場合、runningobj.z()は を返しThis is an objectます。
あなたの場合、オブジェクトを宣言するのではなく、関数のコンテキストにいるだけです。xつまり、 orで使用した構文を使用する必要がありますy

于 2013-07-02T18:02:27.370 に答える