あなたはここでいくつかの異なることを思いつきましたが、最初にあなたの主な質問を見つけようとします.
一般に....
function() { ... }
は関数式です。2
構文的に、これはorと同じレベルにあります[4,5]
。これは値を表します。そうするvar foo=function(){ ... }
ことで、毎回計画どおりに機能します。
function foo() { ... }
関数宣言です。これは と同じことを行うように見えるかもしれませんがvar foo=function(){...}
、小さな注意点があります。宣言として、JS の変数ホイストの概念と同様に機能します (基本的に、すべての変数宣言は、式が評価される前に行われます)。
良い例はここからです:
function test() {
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function () { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
function bar() { // function declaration, given the name 'bar'
alert("this will run!");
}
}
test();
基本的に変数ホイストは値を一番上に持ってきたので、このコードは (理論上) と同等です:
function test() {
var foo;//foo hoisted to top
var bar=function(){//this as well
alert("this will run!");
}
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function () { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
}
注意: 私は、JS インタープリターは理論に従うのに苦労していると言いたいと思います。ここでは、セクションの最後に、理論と実践が機能しない良い例を示します (式と宣言のトピックに関する詳細もあります)。
おもしろい事実:function foo() {...}
括弧で囲むと、宣言が式に変換され、次のような奇妙なコードになる可能性があります。
(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined
理由がなければ、これをしないでください。
要約 var foo=function(){ ... }
は*ちょっと*関数と同じfoo(){ ... }
ですが、前者はあなたが思うところにあると思うことをしますが、後者は括弧で囲まない限り奇妙なことをしますが、それは範囲を台無しにします.JSインタープリターはあなたを許可します仕様で構文エラーと見なされることを行うため、間違っていることが実際には正しいと信じるようになります。
関数式( var f=function(){...}
) を使用してください。特に、ドット構文を使用しているときに多少強制されることを考えると、そうしない本当の理由はありません。
2番目に触れたものに……
何を言いたいのかよくわかりませんが、これについては他のすべてとはまったく異なります。
var foo = {
baz: 43,
doSomething:function() {
...
}
}
これは、オブジェクト リテラル構文として知られています。この構文に基づいた JSON は、data をフォーマットするための非常に巧妙な方法であり、JS のこの構文は、新しいオブジェクトを宣言するためによく使用されます。 . また、XML を使用するのと同じ方法で使用することもでき、すべてのクールな子供たちに好まれています...
とにかく、基本的にオブジェクトリテラル構文は次のように機能します。
{ name1: val1, .... namek:valk }
この式は、特定の値が初期化されたオブジェクトです。そうすることは、次のことをvar obj={ name1: val1, .... namek:valk }
意味します。
obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y
...
obj.namek==valk;
では、これは私たちの例と何の関係があるのでしょうか? 基本的に、式はシングルトン オブジェクトを宣言するためによく使用されます。しかし、オブジェクトのプロトタイプを宣言するためにも使用できるため、誰かが後で var newObj=Object.create(foo) を実行すると、newObj はプロトタイプとして foo を持つことになります。
プロトタイプ継承の有用性を実際に知りたい場合は、プロトタイプ継承を詳しく調べてください。Douglas Crockford は、彼の多くの講演の1 つでそれについて詳しく語っています)。