Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript]zasięg zmiennej
porzeczki
post 29.01.2017, 05:07:12
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


przedszkole to przedszkole
  1. function foo() {
  2. var num = 42;
  3. bar = function() { num++; }
  4. gLogNumber = function() { console.log(num); }
  5. setN = function(x) { num = x; }
  6. }
  7.  
  8. foo();
  9. bar();
  10. gLogNumber();// 43


w foo definiuję lokalną zmienną a w bar inkrementuję globalną. Uczyli mnie że zmienne globalne i lokalne o tej samej nazwie to 2 różne zmienne.
Go to the top of the page
+Quote Post
trueblue
post 29.01.2017, 08:40:06
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://forum.php.pl/index.php?s=&showt...t&p=1209446


--------------------
Go to the top of the page
+Quote Post
by_ikar
post 29.01.2017, 13:11:45
Post #3





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Kiedy używasz var/let/const to tworzysz nową zmienną w danym scope (let/const nawet w bloku). Kiedy deklarujesz zmienną i nie używasz do tego var/let/const wtedy twoja zmienna tworzy się w global scope, to znaczy przypisuje się do window.

Więc mógłbyś zrobić tak:

  1. function foo() {
  2. var num = 42;
  3. bar = function() { num++; }
  4. gLogNumber = function() { console.log(num); }
  5. setN = function(x) { num = x; }
  6. }
  7.  
  8. foo();
  9. window.bar();
  10. window.gLogNumber();// 43


Co zrobić żeby do takiej sytuacji nie dopuścić? Używać strict mode:

  1. 'use strict';
  2.  
  3. function foo() {
  4. var num = 42;
  5. bar = function() { num++; }
  6. gLogNumber = function() { console.log(num); }
  7. setN = function(x) { num = x; }
  8. }
  9.  
  10. foo()
  11.  
  12. Uncaught ReferenceError: bar is not defined
  13. at foo (<anonymous>:4:7)
  14. at <anonymous>:1:1


Tutaj więcej informacji o strict mode: https://developer.mozilla.org/en-US/docs/We...nce/Strict_mode
Go to the top of the page
+Quote Post
porzeczki
post 29.01.2017, 18:26:31
Post #4





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


(odpowiadam sam sobie. Może tu kiedyś wrócę.)


//jeśli zdefiniowałeś globalną zmienną to lokalnie w funkcji użycie nazwy tej zmiennej (bez window.)
odnosi się do niej ALE jeśli w tej lokalnej funkcji zdefiniowałem lokalną zmienną o tej samej nazwie
to ona PRZYSŁANIA globalną i dostęp do globalnej musze poprzedzić przedrostkiem window..


  1. var global_ten=10;
  2. function foo() {
  3. var global_ten = 42;
  4. bar = function() {
  5. global_ten++;
  6. console.log(window.global_ten);
  7. console.log(global_ten); }
  8. }
  9. foo();
  10. bar(); // 10, 43
  11. -----------------------------
  12. var global_ten=10;
  13. function foo() {
  14. bar = function() {
  15. global_ten++;
  16. console.log(window.global_ten);
  17. console.log(global_ten); }
  18. }
  19. foo();
  20. bar(); // 11, 11
Go to the top of the page
+Quote Post
by_ikar
post 30.01.2017, 08:23:18
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Tak na przyszłość, używaj strict mode, żeby nie odciąć się od tego jak kiedyś JS działał, a jak działa teraz. Przykładowo w tym twoim ostatnim poście, nigdzie nie masz deklaracji bar i już by był błąd. Uważam że takie rzeczy trzeba wiedzieć od samego początku, dlatego że już na początku przestanie wprowadzać to niepotrzebne zamieszanie oraz nie pozwoli ci uczyć się złych nawyków.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 13:01