2015-04-17 20 views
6

Często widzę, że gdy funkcja musi być wywołana z powiązanymi parametrami w żadnym konkretnym kontekście, to undefined jest częściej niż nie jest preferowana w porównaniu z null jako wyborem z kontekstu, jak w:jaka jest zaleta wiązania z `undefined` zamiast` null`

f.call(undefined, param1, param2) 

jest korzystniejszy:

f.call(null, param1, param2) 

Zastanawiam się czy jest jakiś szczególny powód do tego?

+0

Preferencje. To tylko kwestia gustu. –

+0

Aby uzyskać więcej informacji: http://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript AND http://saladwithsteve.com/2008/02/javascript -undefined-vs-null.html –

+0

null oznacza, że ​​istnieje obiekt bez wartości, a undefined oznacza, że ​​nic nie ma. Ta koncepcja istnieje tylko w js, o ile wiem. – mondjunge

Odpowiedz

6

Jaka jest korzyść związania z undefined zamiast z null?

Nie sądzę, że istnieje. Od 10.4.3 Entering Function Code:

  1. Jeśli kod funkcji jest strict code ustaw ThisBinding do thisArg.
  2. Else jeśli thisArg jest zerowy lub niezdefiniowany ustaw ThisBinding do globalnego obiektu.
  3. ...

Tak więc, jeśli kod nie jest ścisłe, w obu przypadkach this zostanie ustawiony na globalnym obiektu.

Ale jeśli kod jest ścisły, this będzie w rzeczywistości null lub undefined. f można zaimplementować w celu rozróżnienia tych przypadków, ale nie wydaje mi się to bardzo prawdopodobny scenariusz.

+1

Rozumiem, dziękuję. Więc równie dobrze mogę użyć 'null', tak jak robiłem to wcześniej, ponieważ traktuję' undefined' jako coś, czego nie dotknąłem i próbuję tego uniknąć w moich aplikacjach, podczas gdy 'null' oznacza, że ​​wartość została celowo ustawiona . Jak nazywam funkcję, celowo ustalam kontekst. –

+1

Brzmi bardzo rozsądnie dla mnie! (tak to też robię) –

+1

Tylko ze względu na kompletność, excract z ecma script third edition http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262, % 203rd% 20edition,% 20December% 201999.pdf 'Dzwoniący podaje tę wartość. Jeśli ta wartość podana przez wywołującego nie jest obiektem (włączając w to przypadek, w którym jest zerowy), wówczas ta wartość jest globalnym obiektem " – Olga

1

W javascript, undefined wykracza poza scenariusz, w którym nie została ustawiona wartość. Na przykład, jeśli szukasz właściwości w modelu, który nie istnieje, to da on wynik niezdefiniowany.

Nie jest to dziwne, albo mieć kod jak poniżej:

var k;

// zrób coś (prawdopodobnie ustawiam)

alert (k);

Jeśli wartość nie została ustawiona, będzie niezdefiniowana, a nie pusta.

Krótko mówiąc, jest to nadal preferencja, ale użycie niezdefiniowanej opcji powoduje większe prawdopodobieństwo przechwycenia przypadków, w których wartości nie zostały zainicjowane lub próby uzyskania dostępu do właściwości obiektów, które nie istnieją.

Nie jestem pewien, czy to odpowie na twoje pytanie.

+0

To naprawdę nie wyjaśnia, dlaczego jeden mógłby użyć drugiego w kontekście' .call'. –

+1

dziękuję, ale to nie odpowiada na moje pytanie, ponieważ jestem dość dobry w odróżnianiu 'null' od' undefined' :) –

+0

Zgadzam się, że jest to więcej w koncepcji. Idea może być taka, że ​​ponieważ nie można podać żadnej związanej funkcji żadnej wartości "to" (a "null" jest w rzeczywistości wartością samą w sobie), to "niezdefiniowane" ma więcej sensu (rodzaj "żadnej wartości", ponieważ żadna wartość matters "[przyjmując wartość zerową jako wartość bez odniesienia do obiektu, w przeciwieństwie do braku prawidłowej wartości]). –

Powiązane problemy