W dowolnej przeglądarce internetowej wykonanie następującego skryptu spowoduje wysłanie 'wee'
do konsoli. W węźle wysyła {}
.Gdzie są przechowywane vary w Nodejs?
var d = 'wee';
console.log(this.d);
Zdaję sobie sprawę, że w węźle this
odnosi się do eksportu sprzeciw w tej sprawie. Wiem o zmiennej global
i to nie jest to, do czego próbuję uzyskać dostęp. Poza tym powyższy skrypt nie ustawia wartości d
na obiekcie globalnym. Gdzie do diabła się dzieje? Mogę uzyskać do niego bezpośredni dostęp przez console.log(d);
w powyższym skrypcie, ale wygląda na to, że został ukryty w jakiejś niestandardowej przestrzeni bez żadnego powodu.
ja też sobie sprawę, że usunięcie var
uzna d
na obiekcie global
, co jest oczekiwane zachowanie, chociaż wydaje się głupi, aby mieć var
w górnym zakresie poziomu przechowywania jej wartości w innym miejscu niż „gołe” zmiennych. Chodzi mi o to, czy system modułowy nie ma być czymś w rodzaju cyfrowej profilaktyki chroniącej przed globalnym zanieczyszczeniem? Tutaj wydaje się, że tak łatwo złamać wzór i tak trudno zrobić coś standardowego.
d
nie jest zadeklarowany na obiekcie module
.
Nie muszę uzasadniać, dlaczego zadaję to pytanie, ale odpowiem na pierwszy troll, aby przyszedł z "ale dlaczego chcesz zrobić dur hurr".
var d = {};
d.bleep = 'y';
var a = Object.keys(d);
d.bloop = 'y';
d.blop = 'y';
var b = Object.keys(d);
// c = b - a;
var c = b.filter(function (item) {
if(a.indexOf(item) === -1) {
return true;
}
return false;
});
console.log(a,b,c);
W ten sam sposób, że mogę rozróżnienia między niektórymi państwami obiektowych d
, powinienem być w stanie odróżnić stany górnym zakresie poziomu. W przeglądarce jest to obiekt window
, określony przez this
w zasięgu najwyższego poziomu. Powinienem być w stanie ocenić właściwości środowiska przed i po wykonaniu skryptu, aby określić wiele rzeczy, z których jednym byłaby inspekcja funkcji i zmiennych zadeklarowanych w górnym zakresie dowolnego skryptu, które mogą być następnie zastosowane do obiekt eksportu. W ten sposób ułatwiają programowo wygenerować owijarki moduł dla skryptów, które nie zostały napisane jako moduły z prostym forEach
stosowanej do listy najlepszych funkcji poziomu i zmiennych przypisać whateverThisIs['varFunc']
do module.exports['varFunc']
...
i takie tam ...
To zachowanie wydaje się być podobne do anonimowej funkcji. W anonimowej funkcji może odnosić się do obiektu , ponieważ musiałby on zostać wywołany bezpośrednio (ponieważ znajdują się one w zakresie funkcji anon), a przecieki vars zadeklarowane bez słowa kluczowego var
mogły trafić do obiektu window
. Nie przeczytałem jeszcze całego podręcznika, może to właśnie się dzieje, ale miałem wrażenie, że każdy moduł został wykonany w jego własnym kontekście (oknie) i że węzeł przekazał wiadomości między kontekstami modułów poprzez użycie global
i module.exports
...
Nie wiem. Chcę jednak wiedzieć. Jeśli wiesz, daj mi znać.
To idzie w lokalnej zakresu zmiennej. W module Twój kod jest zawijany w funkcję. Po prostu tego nie widzisz. –
Więc to jest po prostu anonimowa funkcja? Na pewno? – Kastor
Tak ... cóż, nie pamiętam, czy to anonimowe, ale to nie ma znaczenia. To jest funkcja. Pierwszy parametr zdefiniowany dla funkcji to 'exports', a pusty obiekt jest przekazywany do tego parametru. Ten sam obiekt jest ustawiony jako "ta" wartość funkcji. Możesz przetestować to za pomocą 'console.log (argumenty [0] === export, argumenty [0] === this);', a otrzymasz 'true' dla obu. –