Przyzwyczaiłem się dodawać następujące rzeczy na szczycie wszystkich moich funkcji:
var local = {};
W ten sposób jawnie zakres wszystkich zmiennych. Na przykład:
for (local.i=0; local.i<x; local.i++) {} // local scope: good!
for (i=0; i<x; i++) {} // accidental global scope: bad!
P: Czy istnieje sposób na zmianę prototypu funkcji w celu włączenia zmiennej local = {}; jako część jego definicji? W ten sposób mogę założyć, że "lokalny" oznacza wyraźnie w zakresie lokalnym.
Odpowiedzi:
3 dla odpowiedzi № 1Odpowiedź brzmi: nie, możesz niejawnie dodaćdeklaracja zmiennych i zainicjuj ją w każdym zakresie funkcji (dzięki Bogu). Musisz zarządzać swoimi zakresami ręcznie, korzystając z narzędzi analitycznych, kiedy / w razie potrzeby.
Wyobraź sobie przez chwilę, czy to możliwe. Każdy załadowany kod może potencjalnie uszkodzić dowolny inny zakres zmiennych, skutecznie pokonując cel zmiennych zakresu.
The Function.prototype
nie pomoże, ponieważ prototypowe dziedziczenie nie ma nic wspólnego ze zmiennym zakresem.
Twoja sztuczka do ochrony i
umieszczając go w local
obiekt niczego nie rozwiązuje, po prostu przesuwa problem z i
zmienna na local
zmienna i nadal nie powstrzymuje cię przed użyciem i
zamiast local.i
.
Włączając "use strict";
może pomóc, dostarczając przydatne komunikaty o błędach, należy pamiętać, że zmienia zachowanie w niektórych sytuacjach, które mogą złamać kod.
1 dla odpowiedzi nr 2
Nie, nie możesz tego zrobić, nie możesz wstrzyknąć kodu w dowolne funkcje i mieć kłopotów ich zakres lokalny, zmieniając Function.prototype
i to jest dobry rzecz.
Poza tym, jak byś to zrobił egzekwować używając local
obiekt dla zmiennych lokalnych? A w jaki sposób zezwolić na zmienne wyszukiwania poprzez zakresy rodzicielskie, takie jak:
function f() {
var a = 5;
return function g(b) {
return a + b;
};
}
W twoim rozwiązaniu będziesz miał local
obiekt w f
i g
funkcje, ale local
zmienna w g
ukrył zmienną nadrzędną ...
function f() {
var local = { a : 5 };
return function g(b) {
// This declaration hides the parent"s declaration
var local = { b : b };
// How would local.a be found?
return local.a + local.b;
};
}
Istnieje jednak znacznie prostsze rozwiązanie pierwotnego problemu: po prostu włącz tryb ścisły za pomocą "use strict"
. W ten sposób pojawia się błąd, gdy przypadkowo wprowadzisz zmienną do zakresu globalnego. Na przykład twoja druga próbka rzuciłaby a ReferenceError
kiedy próbuje uzyskać dostęp do niezadeklarowanego i
zmienna (zamiast tworzenia nowej zmiennej globalnej).
Zauważ, że tryb ścisły wykracza poza zapobieganie przypadkowym zmiennym globalnym, przeczytaj na ten temat więc rozumiesz konsekwencje!