2015-07-08 19 views
5

JavaScript ma mnóstwo szalonej elastyczności. Postanowiłem go wykorzystać i zmienić funkcję podczas pierwszego połączenia. Czy to źle? To działa tak:Nieprawidłowe, aby funkcja zmieniła odwołanie do zmiennej, z której wywołano?

(function(){ 
    var nextAfter = function(){}; 
    Something.prototype.next = function(){ 
     //do pre-start actions. 
     this.next = nextAfter; 
    }; 
})(); 

Funkcja ta nazywa się wewnątrz pętli głównej, więc to jest wywoływana wiele razy, ale instancja jest zawsze tylko „niby” do wystąpienia raz.

+1

"potencjalne zagrożenie bezpieczeństwa"? – undefined

+1

Ta funkcja nie zmienia się sama. Prototyp 'Something' nadal będzie miał funkcję' next() ', ale gdy zostanie wywołana, definiuje' next() 'bezpośrednio na obiekcie będącym instancją' Something'. – nnnnnn

+0

@nnnnnn Nigdy bym tego nie przyłapał! Cieszę się, że coś o tym powiedziałeś. W tym momencie myślę, że to, o co pytam, jest inne, takie jak: posiadanie funkcji zmienia odniesienie do zmiennej, z której ją wywołano. – Andrew

Odpowiedz

6

Jest to całkowicie uzasadniona rzecz do zrobienia.

Na przykład Może to być użyteczny sposób wprowadzania zmian stanu w automatach stanów, ale jestem pewien, że można znaleźć wiele innych zastosowań.

Możesz również sprawdzić, jak wdrożyć tę samą funkcjonalność w przypadku zamknięć - może być czystszy w zależności od przypadku użycia.

Edytuj; przykładem zamknięcia, które nie zmienia prototyp

Something = (function(){ 
    var next = function() { next = nextAfter; console.log("A"); } 
    var nextAfter = function() { console.log("B"); } 

    return { 
     next: function(){ next(); } 
    } 
})(); 

Zaletą zamknięcia jest to, że nie zmieniają się globalną funkcję prototyp dla tego typu obiektu, a teraz możesz mieć kilka niezależnych obiektów, gdzie każdy obiekt zamknięcia może zachować swój własny stan.

+0

Powiedziałeś "tę samą funkcjonalność z zamknięciami", nie jestem pewien, czy rozumiem dokładnie, co masz na myśli. Mój przykład to zamknięcie, ale nie sądzę, że tak też się nazywasz? – Andrew

+0

Dodałem przykład zamknięcia – Soren

Powiązane problemy