Zmienne to struktura danych, która przypisuje do wartości reprezentatywną nazwę. Mogą one zawierać dane dowolnego rodzaju.
Nazwa zmiennej jest nazywana identyfikatorem. Wymagany jest prawidłowy identyfikator te reguły:
- Identyfikatory mogą zawierać litery Unicode, znaki dolara ($) i podkreślenia znaków (_), cyfr (0–9), a nawet niektórych znaków Unicode.
- Identyfikatory nie mogą zawierać odstępów, ponieważ parser używa spacji do
dla tych elementów. Jeśli na przykład spróbujesz wywołać zmienną
my Variable
zamiastmyVariable
, parser widzi 2 identyfikatory,my
iVariable
oraz zwraca błąd składni („nieoczekiwany token: identyfikatora”). Identyfikatory muszą zaczynać się od litery, podkreślenia (
_
) lub znaku dolara ($
). Nie mogą zaczynać się od cyfr, aby uniknąć pomylenia liczb i identyfikatory:let 1a = true; > Uncaught SyntaxError: Invalid or unexpected token
Jeśli JavaScript zezwala na liczby na początku identyfikatora, składające się wyłącznie z cyfr, co powoduje konflikty między numerami używanymi jako Liczby i liczby używane jako identyfikatory:
let 10 = 20 10 + 5 > ?
„Zarezerwowane słowa” które mają już znaczenie składniowe, nie mogą być używane jako identyfikatory.
Identyfikatory nie mogą zawierać znaków specjalnych (
! . , / \ + - * =
).
Poniższe zasady nie są rygorystyczne dotyczące tworzenia identyfikatorów, ale są sprawdzone metody branżowe, które ułatwiają zarządzanie kodem. Jeśli Twój określony ma różne standardy, przestrzegaj ich, by zapewnić spójność.
Korzystając z przykładu z wbudowanymi metodami i właściwościami JavaScriptu, camelCase (także „camelCase”) to często używana konwencja składające się z wielu słów. Wielbłąda to praktyka wielkie litery na początku każdego wyrazu z wyjątkiem pierwszego w celu poprawy czytelność bez spacji.
let camelCasedIdentifier = true;
W niektórych projektach używane są inne konwencje nazewnictwa w zależności od kontekstu i charakteru. danych. Na przykład pierwsza litera class jest zwykle pisane wielką literą, dlatego w nazwach klas wielowyrazowych często używany jest wariant wielbłąda przypadek zwany potocznie „wielkim wielbłądem” lub Zgłoszenie Pascal.
class MyClass {
}
Identyfikatory powinny zwięźle określać charakter zawartych w nich danych (w przypadku
np. currentMonthDays
to lepsza nazwa niż theNumberOfDaysInTheCurrentMonth
)
i czytelne w mgnieniu oka (originalValue
to lepszy wynik niż val
).
Identyfikatory myVariable
używane w tym module działają w kontekście
pojedyncze przykłady, ale byłyby
bardzo nieprzydatne w kodzie produkcyjnym,
nie podawać żadnych informacji o tym, jakie dane zawierają.
Identyfikatory nie powinny być zbyt szczegółowe dotyczące danych, ponieważ
ich wartości mogą się zmieniać w zależności od tego, jak skrypty działają na danych
decyzji, jakie podejmują przyszli opiekunowie. Na przykład zmienna pierwotnie podana w tagu
identyfikator miles
może zostać później zmieniony na wartość w kilometrach
projektu i wymagać od opiekunów klienta zmiany wszelkich odniesień do tej zmiennej
aby uniknąć nieporozumień. Aby temu zapobiec, użyj identyfikatora distance
.
JavaScript nie nadaje żadnych specjalnych uprawnień ani znaczenia identyfikatorom, które
zaczynają się od znaku podkreślenia (_
), ale zwykle są używane do pokazywania,
zmienna, metoda lub właściwość są „prywatne”, co oznacza, że jest przeznaczona wyłącznie
do użytku w kontekście obiektu, który go zawiera, i nie powinien być
które mogą zostać wyświetlone lub zmodyfikowane poza tym kontekstem. Ta konwencja została przeniesiona
z innych języków programowania i poprzedza dodanie języka JavaScript
własności prywatnej.
Deklaracja zmiennej
Istnieje kilka sposobów rozpoznania w JavaScripcie identyfikatora,
o nazwie „deklarowanie”, zmienną. Zmienna jest deklarowana za pomocą metod: let
, const
,
lub var
słów kluczowych.
let myVariable;
Użyj funkcji let
lub var
, aby zadeklarować zmienną, którą możesz zmienić w dowolnym momencie. Te
słowa kluczowe informują interpreter JavaScriptu, że ciąg znaków jest
, który może zawierać wartość.
Podczas pracy w nowoczesnej bazie kodu używaj let
zamiast var
. var
nadal działa
stosowanych w nowoczesnych przeglądarkach, ale zachowuje pewne nieintuicyjne działanie, które definiuje się
najwcześniejszych wersji JavaScriptu, ale później nie można było ich zmienić na
aby zachować zgodność wsteczną. Aby rozwiązać problemy, dodano let
w standardzie ES6.
z projektem var
.
Zadeklarowana zmienna jest inicjowana przez przypisanie do niej wartości. Użyj
pojedynczy znak równości (=
), aby przypisać wartość do zmiennej lub ją przypisać. Możesz zrobić
w tym samym oświadczeniu:
let myVariable = 5;
myVariable + myVariable
> 10
Możesz też zadeklarować zmienną za pomocą funkcji let
(lub var
) bez jej inicjowania
od razu. Jeśli to zrobisz, początkowa wartość zmiennej będzie wynosić undefined
do chwili
przypisuje mu wartość.
let myVariable;
myVariable;
> undefined
myVariable = 5;
myVariable + myVariable
> 10
Zmienna z wartością undefined
różni się od zmiennej niezdefiniowanej
, których identyfikator nie został jeszcze zadeklarowany. Odwoływanie się do zmiennej, która nie została podana
powoduje błąd.
myVariable
> Uncaught ReferenceError: myVariable is not defined
let myVariable;
myVariable
> undefined
Powiązanie identyfikatora z wartością jest ogólnie nazywane „wiązaniem”.
Składnia po słowach kluczowych let
, var
i const
jest nazywana
„lista powiązań”, i umożliwia dodawanie wielu deklaracji zmiennych rozdzielonych przecinkami
(kończy się oczekiwanym średnikiem). Spowoduje to utworzenie poniższych fragmentów kodu
funkcjonalnie identyczne:
let firstVariable,
secondVariable,
thirdVariable;
let firstVariable;
let secondVariable;
let thirdVariable;
Ponowne przypisanie wartości zmiennej nie używa parametru let
(ani var
), ponieważ JavaScript
wie już, że zmienna istnieje:
let myVariable = true;
myVariable
> true
myVariable = false;
myVariable
> false
Możesz zmienić przypisanie zmiennych wartości na podstawie ich dotychczasowych wartości:
let myVariable = 10;
myVariable
> 10
myVariable = myVariable * myVariable;
myVariable
> 100
Jeśli spróbujesz ponownie zadeklarować zmienną za pomocą interfejsu let
w środowisku produkcyjnym,
pojawi się błąd składni:
let myVariable = true;
let myVariable = false;
> Uncaught SyntaxError: redeclaration of let myVariable
Przeglądarki narzędzia dla programistów
są bardziej restrykcyjne dotyczące ponownej deklaracji let
(i class
), więc możesz nie
zobaczysz ten sam błąd w konsoli programisty.
Aby zachować zgodność ze starszą wersją przeglądarki, var
zezwala na niepotrzebną ponowną deklarację
bez błędów w żadnym kontekście:
var myVariable = true;
var myVariable = false;
myVariable\
> false
const
Użyj słowa kluczowego const
do zadeklarowania stałej. Jest to typ zmiennej
jest od razu zainicjowany i nie można go zmienić. Identyfikatory stałych
obowiązują te same reguły, co w zmiennych zadeklarowanych za pomocą funkcji let
(i var
):
const myConstant = true;
myConstant
> true
Nie można zadeklarować stałej bez natychmiastowego przypisania jej wartości, ponieważ
stałych nie można ponownie przypisać po ich utworzeniu, więc wszystkie niezainicjowane
stała pozostanie na zawsze undefined
. Jeśli spróbujesz zadeklarować stałą
bez jego zainicjowania pojawi się błąd składni:
const myConstant;
Uncaught SyntaxError: missing = in const declaration
Próbujesz zmienić wartość zmiennej zadeklarowanej za pomocą funkcji const
w taki sposób, w jaki możesz
zmiana wartości zmiennej deklarowanej przez polecenie let
(lub var
) powoduje, że typ
błąd:
const myConstant = true;
myConstant = false;
> Uncaught TypeError: invalid assignment to const 'myConstant'
Jeśli jednak z obiektem jest powiązana stała, właściwości tego obiektu Obiekt można zmienić.
const constantObject = { "firstvalue" : true };
constantObject
> Object { firstvalue: true }
constantObject.secondvalue = false;
constantObject
> Object { firstvalue: true, secondvalue: false }
Stała, która zawiera obiekt, jest stała odwoływać się do zmiennej wartości danych. Chociaż stałej nie można zmienić, właściwości jej można zmienić, dodać lub usunąć:
const constantObject = { "firstvalue" : true };
constantObject = false
> Uncaught TypeError: invalid assignment to const 'constantObject'
Jeśli nie spodziewasz się, że zmienna zostanie przypisana ponownie,
stałą. Korzystanie z const
informuje zespół programistów lub przyszłych opiekunów
aby nie zmieniać tej wartości, co pozwoli uniknąć naruszenia założeń dotyczących Twojego kodu
sposób jej wykorzystania – np. że zmienna zostanie w końcu
oceniane na podstawie oczekiwanego typu danych.
Zakres zmiennej
Zakres zmiennej to część skryptu, w której ta zmienna jest dostępna.
Zmienna nie zostanie zdefiniowana poza zakresem zmiennej – nie jako identyfikator.
zawiera wartość undefined
, ale tak, jakby nie została zadeklarowana.
W zależności od słowa kluczowego użytego do zadeklarowania zmiennej oraz kontekstu, w którym możesz określić zakres zmiennych, aby blokować instrukcje (zakres blokowy), poszczególnych funkcji (zakres funkcji) lub całej aplikacji JavaScript. (zakres globalny).
Zakres bloku
Każda zmienna zadeklarowana za pomocą funkcji let
lub const
ma zakres ograniczony do najbliższej wartości
zawierający instrukcję blokowania,
co oznacza, że do zmiennej można uzyskać dostęp tylko w ramach tego bloku. Próbujemy
dostępu do zmiennej o zakresie ograniczonym do bloku poza nią powoduje to samo
jako próby uzyskania dostępu do zmiennej, która nie istnieje:
{
let scopedVariable = true;
console.log( scopedVariable );
}
> true
scopedVariable
> ReferenceError: scopedVariable is not defined
W przypadku JavaScriptu zmienna o zakresie blokowym nie istnieje poza blokiem, który go zawiera. Możesz na przykład zadeklarować stałą wewnątrz bloku, a następnie zadeklaruj inną stałą poza tym blokiem, która używa funkcji ten sam identyfikator:
{
const myConstant = false;
}
const myConstant = true;
scopedConstant;
> true
Mimo że zadeklarowana zmienna nie może rozciągać się na blok nadrzędny, jest dostępne dla wszystkich bloków podrzędnych:
{
let scopedVariable = true;
{
console.log( scopedVariable );
}
}
> true
Wartość zadeklarowanej zmiennej można zmienić z poziomu bloku podrzędnego:
{
let scopedVariable = false;
{
scopedVariable = true;
}
console.log( scopedVariable );
}
> true
Nową zmienną można zainicjować ciągiem let
lub const
w elemencie podrzędnym
blok bez błędów, nawet jeśli używa tego samego identyfikatora co zmienna w
Blokada rodzica:
{
let scopedVariable = false;
{
let scopedVariable = true;
}
console.log( scopedVariable );
}
> false
Zakres funkcji
Zmienne zadeklarowane za pomocą funkcji var
mają zakres ograniczony do najbliższej funkcji zawierającej
(lub statyczny blok inicjowania w klasie).
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
Ten problem nadal występuje po wywołaniu funkcji. Mimo że jest inicjowana podczas wykonywania funkcji, niedostępne poza zakresem funkcji:
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
myFunction();
> true
scopedVariable;
> ReferenceError: scopedVariable is not defined
Zakres globalny
Zmienna globalna jest dostępna w całej aplikacji JavaScript, wewnątrz wszystkich bloków i funkcji, po dowolny skrypt na stronie.
Może się to wydawać pożądaną wartością domyślną, jednak zmienne, które wchodzą w skład dowolnej części dostępu do aplikacji i ich modyfikacji, może więc zwiększyć niepotrzebny nakład pracy, kolizji ze zmiennymi w innym miejscu w aplikacji o tym samym identyfikatorze. Dotyczy to całego kodu JavaScriptu wykorzystywanego podczas renderowania strony, np. biblioteki innych firm i analitykę użytkowników. Dlatego sprawdzone metody unikania zakłócania zakresu globalnego, gdy to możliwe.
Dowolna zmienna zadeklarowana za pomocą parametru var
poza funkcją nadrzędną lub za pomocą let
lub
const
poza blokiem nadrzędnym, jest globalny:
var functionGlobal = true; // Global
let blockGlobal = true; // Global
{
console.log( blockGlobal );
console.log( functionGlobal );
}
> true
> true
(function() {
console.log( blockGlobal );
console.log( functionGlobal );
}());
> true
> true
Przypisanie wartości do zmiennej bez jej jednoznacznego zadeklarowania (czyli przez
nigdy nie użyto do jego utworzenia var
, let
ani const
) podnosi zmienną do
zakresu globalnego, nawet jeśli jest zainicjowana wewnątrz funkcji lub bloku. Zmienną
utworzony za pomocą tego wzorca jest czasami nazywany „domniemanym globalnym”.
function myFunction() {
globalVariable = "global";
return globalVariable
}
myFunction()\
> "global"
globalVariable\
> "global"
Z wymiennym podnośnikiem
Zmienne i deklaracje funkcji są przenoszone na górę zakresu,
co oznacza, że interpreter JavaScript przetwarza wszystkie zmienne zadeklarowane w dowolnym
w skrypcie i skutecznie przenosi go do pierwszego wiersza
przed wykonaniem skryptu. Oznacza to, że zmienna zadeklarowana za pomocą funkcji
Można odwołać się do funkcji var
przed zadeklarowaniem zmiennej bez napotykania
błąd:
hoistedVariable
> undefined
var hoistedVariable;
Ponieważ hostowana jest tylko deklaracja zmiennej, a nie inicjalizacja,
zmienne, które nie zostały bezpośrednio zadeklarowane za pomocą funkcji var
, let
lub const
które nie są podnoszone:
unhoistedVariable;
> Uncaught ReferenceError: unhoistedVariable is not defined
unhoistedVariable = true;
Jak wspomnieliśmy wcześniej, zadeklarowana, ale niezainicjowana zmienna
ma przypisaną wartość undefined
. To zachowanie ma zastosowanie do zmiennej podniesionej
ale tylko w przypadku tych zadeklarowanych za pomocą funkcji var
.
hoistedVariable
> undefined
var hoistedVariable = 2 + 2;
hoistedVariable\
> 4
To nieintuicyjne zachowanie wynika głównie z podejmowanych przez nas systemu JavaScript i nie można ich zmienić bez ryzyka, a także psuć istniejące witryny.
Rozwiązania let
i const
rozwiązują to zachowanie, zamiast tego zwracają błąd, gdy
uzyskuje dostęp do zmiennej przed jej utworzeniem:
{
hoistedVariable;
let hoistedVariable;
}
> Uncaught ReferenceError: can't access lexical declaration 'hoistedVariable' before initialization
Ten błąd różni się od „niezdefiniowana zmienna podnoszona” Wystąpił błąd
czego można się spodziewać, próbując uzyskać dostęp do niezadeklarowanej zmiennej. Ponieważ JavaScript
który podniósł zmienną, wie, że zostanie ona utworzona
danego zakresu. Zamiast jednak udostępniać tę zmienną przed jej
z wartością undefined
, tłumacz zwróci błąd.
Zmienne zadeklarowane za pomocą funkcji let
lub const
(albo class
) należą do funkcji
„tymczasowa martwa strefa” („TDZ”) od początku bloku nadrzędnego do
w kodzie, gdzie deklarowana jest zmienna.
Martwe strefy czasowe sprawiają, że działanie funkcji let
jest bardziej intuicyjne niż w var
autorów. Ma również kluczowe znaczenie przy projektowaniu strony const
. Stałych nie można
stała się przeniesiona na wierzch swojego zakresu i otrzymuje niejawną wartość
z undefined
nie można następnie zainicjować z konkretną wartością.
Sprawdź swoją wiedzę
Od jakich znaków można rozpocząć identyfikator?
Jaka jest preferowana metoda deklarowania zmiennej, której wartość można zmienić w dowolnym momencie?