2009-03-12 20 views
43

Czy można znaleźć adres pamięci zmiennej JavaScript? Kod JavaScript jest częścią (osadzonej w) zwykłej aplikacji, w której JavaScript jest używany jako interfejs do C++ i nie działa w przeglądarce. Zastosowana implementacja JavaScript to SpiderMonkey.Jak mogę uzyskać adres pamięci zmiennej JavaScript?

+0

Przez "osadzenie w normalnej aplikacji" rozumiesz, że masz stronę internetową z wbudowanym Javascriptem? – Juliet

+0

Nie, nie działa w przeglądarce, nie ma w tym przypadku żadnych stron internetowych. Mechanizm JavaScript jest częścią normalnej aplikacji komputerowej. – vivekian2

Odpowiedz

14

Gdyby było to w ogóle możliwe, byłoby bardzo zależne od silnika javascript. Bardziej współczesny silnik javascript kompiluje kod za pomocą kompilatora just in time, a problemy z jego wewnętrznymi zmiennymi są albo złe dla wydajności, albo zła dla stabilności.

Jeśli silnik na to pozwala, dlaczego nie utworzyć interfejsu wywołania funkcji do natywnego kodu w celu wymiany wartości zmiennej?

+1

Tak, zgadzam się, myślę, że muszę mieć jakiś kod w C++, który może łączyć się z JavaScript. – vivekian2

8

Jest to mniej więcej niemożliwe - strategia oceny JavaScript polega na tym, aby zawsze używać wywołania według wartości, ale w przypadku obiektów (w tym tablic) przekazywana wartość jest odniesieniem do obiektu, który nie jest kopiowany ani klonowany. Jeśli ponownie przypiszesz obiekt do funkcji, oryginał nie zostanie zmieniony, ale jeśli zmienisz przypisanie jednej z właściwości obiektu, wpłynie to na oryginalny obiekt.

To powiedziawszy, co próbujesz osiągnąć? Jeśli chodzi tylko o przekazywanie złożonych danych między C++ i JavaScript, możesz użyć biblioteki JSON do komunikacji. Wyślij obiekt JSON do C++ w celu przetworzenia i pobierz obiekt JSON, aby zastąpić stary.

+0

Świetna uwaga dotycząca ponownego przypisywania samego obiektu lub właściwości. Czy potrafisz w jakiś sposób zmienić Obiekt, na który wskazuje oryginał? – Qwerty

+1

Masz na myśli, zmień odniesienie obiektu w innym zakresie? Nie. W takich sytuacjach najlepiej jest skorzystać z enkapsulacji JS lub obiektów zorientowanych obiektowo, albo poprzez umieszczenie treści funkcji i odniesienia, które chcesz zmienić w tym samym zakresie, albo przez utworzenie odniesienia i elementów funkcji tego samego obiektu . – user2310967

Powiązane problemy