pan trafić na kilka różnych rzeczy tutaj , ale najpierw spróbuję odpowiedzieć na twoje główne pytanie.
Ogólnie ....
function() { ... }
jest wyrażeniem funkcja. Składnie to jest na tym samym poziomie co 2
lub [4,5]
. To reprezentuje wartość o wartości. Czynienie var foo=function(){ ... }
będzie działać zgodnie z planem, za każdym razem.
function foo() { ... }
jest deklaracją funkcji. Może wydawać się, że robi to samo, co var foo=function(){...}
, ale istnieje małe zastrzeżenie. Jako deklaracja działa podobnie do pojęcia zmiennego podnoszenia w JS (zasadniczo wszystkie deklaracje zmiennych są wykonywane przed wyliczeniem dowolnych wyrażeń).
Dobrym przykładem jest z here:
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();
Zasadniczo zmienna podnoszenia dało wartość do góry, tak, że kod jest równa (teoretycznie) do:
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!");
}
}
NB: Chciałbym zabrać to miejsce, aby powiedzieć, że tłumacze JS mają trudności z podążaniem za teorią, więc ufając im nieco niepewnym zachowaniom r nie jest zalecane.Here znajdziesz dobry przykład na końcu sekcji, gdzie teoria i praktyka w końcu nie działają (są też trochę więcej szczegółów na temat wyrażeń w porównaniu do deklaracji).
Ciekawostka: owijanie function foo() {...}
w nawiasach przekształca go z deklaracją do ekspresji, co może prowadzić do pewnego dziwne patrząc kodu jak
(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined
Nie rób tego, jeśli nie mają powód do , Proszę.
Podsumowanievar foo=function(){ ... }
jest * jakoś trochę * taka sama jak funkcja foo(){ ... }
tą różnicą, że były robi to, co myślisz, że to robi, gdzie myślisz, że powinien natomiast druga ma dziwne rzeczy, chyba że zawinąć go w parens, ale to tłumaczy zakres, a tłumacze JS pozwalają ci robić rzeczy, które są uważane za błędy składniowe w specyfikacji, więc jesteś przekonany, że złe rzeczy są w rzeczywistości słuszne, itp.
użyj funkcji wyrażenia (var f=function(){...}
). Nie ma prawdziwego powodu, aby tego nie robić, szczególnie biorąc pod uwagę, że jesteście do tego zmuszeni, kiedy używacie składni kropek.
do drugiego rzeczą, którą dotknął .....
Nie jestem pewien, co powiedzieć, to trochę jakoś zupełnie inna od wszystkiego innego na ten temat.
var foo = {
baz: 43,
doSomething:function() {
...
}
}
jest to tak zwana składnia literalna obiektu. JSON, który jest oparty na tej składni, to a pretty neat way of formatting data, a ta składnia w JS jest często używana do deklarowania nowych obiektów, na przykład z obiektami singleton (unikanie całego bałaganu z deklarowaniem funkcji i używaniem nowych). Może być również stosowany w taki sam sposób XML jest używany i jest preferowane przez wszystkich fajnych dzieciaków ...
Tak czy inaczej, w zasadzie sprzeciwu składnia dosłowne działa tak:
{ name1: val1, .... namek:valk }
To wyrażenie jest obiektem z zainicjowanymi na nim pewnymi wartościami. Czyniąc var obj={ name1: val1, .... namek:valk }
oznacza, że:
obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y
...
obj.namek==valk;
Więc co to ma wspólnego z naszym przykładzie? Zasadniczo twoja ekspresja jest często używana do zadeklarowania pojedynczych obiektów. Ale może być również użyty do zadeklarowania prototypu obiektu, więc ktoś może później zrobić var newObj = Object.create (foo), a newObj będzie mieć foo jako prototyp.
Spójrz szczegółowo na prototypowe dziedziczenie, jeśli naprawdę chcesz uzyskać przydatność. Douglas Crockford mówi o nim szczegółowo w swoich licznych rozmowach one).
Czy zakres pierwszej różni się od drugiego? –
To jest fajny artykuł http://kangax.github.com/nfe/ –
@amnotiam: uzgodniono. Zagłosowano, aby zamknąć. –