/ / Dodawanie lokalnego zakresu do funkcji - javascript

Dodawanie zakresu lokalnego do funkcji - javascript

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 № 1

Odpowiedź 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.prototypei 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!