-3

JavaScript 関数を定義するには、さまざまな方法があります。関数を定義する最も簡単な方法をよく使用します

function myfunc(){
}

そして、次のように変数で関数を定義する方法(使用方法が少し混乱します)

var myvar = myfunc(){
/*some code*/
}

私にとって難しい方法であり、主に次のような高度なプログラマーによって開発されたコードに見られます

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}

お願いします、これについて私のコンセプトを明確にすることはできますか?

4

5 に答える 5

3
function myfunc(){}

関数宣言: 関数は標準構文を使用して宣言されます

function functionName(params[]) {
    //functionbody
}

この構文を使用すると、スコープ実行の開始時に関数が宣言されるため、スコープ内 (および子孫スコープ内) のどこでも使用できます。

var s = myfunc(); //s == 0
function myfunc() {return 0;}

var myfunc = function() {};

これは、関数式として知られるパターンを使用し、無名関数の参照を という名前の変数に割り当てるだけmyfuncです。この構文を使用すると、変数が解析されるまで関数を使用できません。変数がスコープの先頭に引き上げられたとしても、インタープリターが変数を解析するときに変数が初期化されるため、上記の例は機能しません。

var s = myfunc(); //ReferenceError: myfunc is not defined
var myfunc = function() {return 0;};

ただし、以下の例は次のようになります。

var myfunc = function() {return 0;};
var s = myfunc(); //s == 0

3 番目の例は、関数式で行った方法でオブジェクト プロパティ (オブジェクト メソッドとも呼ばれます) に無名関数を割り当てているだけなので、上記のパターンを使用すると、コードは次のようになります。

var onOpen = function() {},
    onClose = function() {},
    SqueezeBox = {//curly braces denotes an object literal
        presets: {//again, this is a nested object literal
             onOpen: onOpen,
             onClose: onClose
        }
    };

これはあなたの例とまったく同じように動作しますが、ここでは変数を使用して匿名関数への参照を取得してからオブジェクトに渡すという唯一の違いがあります。オブジェクトについてもっと知る必要がある場合は、MDN docsを読むことをお勧めします。とにかく、JS の仕組みに本当に興味があるなら、JS に関する非常に優れた記事であるJavascript Gardenをお勧めします。

于 2013-09-27T07:37:30.843 に答える
0

This has already been answered here: What is the difference between a function expression vs declaration in Javascript?.

For the last example, as Atropo said, it's affecting an anonymous function to an object. It's similar to the var example.

于 2013-09-27T07:34:22.253 に答える
0

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}}

彼は、2 つの空の無名関数を持つSqueezeBox別のオブジェクトを含むオブジェクトを作成し、 . より良い方法は、次のようにフォーマットされていることです。presets{}

  var SqueezeBox={
                  presets:{
                           onOpen:function(){/* empty function body */},
                           onClose:function(){/*empty function body */}
                          }
                  }
于 2013-09-27T07:27:15.173 に答える