2015-08-29 2 views
7

Sto costruendo un piccolo gioco di codifica. Per questo gioco, ogni giocatore invia una funzione javascript. Il gioco esegue ognuna di queste funzioni un certo numero di volte in successione e raccolgo i valori restituiti dalle funzioni. Questi valori restituiti sono ciò che è importante per il gusto del gioco. Quindi, se playerFunc è una funzione di lettore-presentate, il mio gioco potrebbe fare qualcosa di simile:Come isolare una funzione dalle variabili globali

var values = [] 
for(var i = 0; i < 1000; i++){ 
    values.push(playerFunc(i)) 
} 
doSomething(values) 

Il problema è, voglio impedire ai giocatori di passaggio di dati da una chiamata all'altra. Per esempio, non vorrei che ci fosse un modo per invocare PlayerFunc per capire se fosse già stato chiamato con un argomento di 0. Per fare questo, immagino che devo impedire l'accesso alle funzioni inviate dal giocatore chiusure e variabili globali.

So che posso liberarmi delle chiusure creando ogni funzione con il costruttore di funzioni, quindi penso di averlo capito. Il blocco dell'accesso alle variabili globali è ciò che sto avendo problemi con.

Posso isolare completamente ogni chiamata di funzione eseguendola in un web worker, ma ho letto che i web worker impiegano circa 40 ms per l'installazione, e potrei aver bisogno di eseguire queste funzioni fino a 1000 volte al secondo, quindi questo è lento.

C'è un altro modo per impedire a una funzione di accedere a variabili globali o di ripristinare in qualche modo l'ambito globale dopo ogni chiamata di funzione?

Questo gioco verrà giocato solo con gli amici per ora, quindi non sono preoccupato per i giocatori che fanno qualcosa di malevolo, ma penso che potrebbero provare a imbrogliare.

+0

Avete qualche codice? Se sì, potresti postarlo su jsFiddle? – zer00ne

+0

Come si esegue la funzione javascript in dotazione? – MinusFour

+0

Si potrebbe provare a eseguire un interprete JavaScript in JavaScript come [js.js] (https://github.com/jterrace/js.js/). Questo sarà molto più lento di JavaScript nativo, ma forse vale la pena girarlo. –

risposta

1

si potrebbe provare qualcosa di simile:

var createFunction = function(fnBody) { 
    var f = new Function('obj', 'window', 'document', '"use strict";' + fnBody); 
    return f.bind({}, {}, {}, {}); 
} 

Qualsiasi accesso ai window o document utilizzerà i parametri al posto delle variabili globali. Siete invitati ad aggiungere più variabili globali per limitare l'accesso. Con "use strict";, impedirai alla funzione fornita di accedere all'ambito globale con variabili non definite.

var createFunction = function(fnBody) { 
 
    var f = new Function('obj', 'window', 'document', '"use strict";' + fnBody); 
 
    return f.bind({}, {}, {}, {}); 
 
} 
 
    
 
createFunction('window.hello = "test"')(); 
 
console.log(window.test); //undefined 
 
createFunction('hello = "test";')(); //throws error 
 
console.log(hello);

Questo genera un errore.

+0

Possono ancora accedere all'oggetto globale con 'this' oppure imposta le proprietà su altri globals come 'String' –

+0

Puoi sempre aggiungerli all'elenco di parametri. Tuttavia, sembra che ho sbagliato con la frase 'with'. Le variabili non dichiarate non saranno associate a 'obj' ma all'ambito globale. – MinusFour