Capisco che ogni funzione in JavaScript è un oggetto di prima classe e ha una proprietà interna [[scope]] che ospita i record di binding delle variabili libere della funzione. Tuttavia, ci sono due casi speciali.È vero che ogni funzione in JavaScript è una chiusura?
La funzione creata dal costruttore Funzione ha anche una chiusura? L'oggetto funzione creato dal costruttore di funzioni è speciale, poiché il suo [[scope]] potrebbe non riferirsi agli ambienti lessicali delle sue funzioni esterne, ma solo al contesto globale. Ad esempio,
var a = 1; var fn = (function outer() { var a = 2; var inner = new Function('alert(a); '); return inner; })(); fn(); // will alert 1, not 2.
Questo non è intuitivo. Si chiama anche chiusura?
Se una funzione interna non ha variabili libere, possiamo dire che una chiusura si forma quando viene creata la funzione interna? Ad esempio,
// This is a useless case only for academic study var fn = (function outer() { var localVar1 = 1, localVar2 = 2; return function() {}; })();
In questo caso, fn si riferisce a un oggetto funzione vuoto creato come funzione interna. Non ha variabili libere. In questo caso possiamo dire che si è formata una chiusura?
Allora, qual è la tua definizione di "chiusura"? – Bergi
Ulteriori commenti su questo comportamento sono disponibili qui: http://www.bennadel.com/blog/1909-javascript-function-constructor-does-not-create-a-closure.htm Il comportamento sembra correlato al comportamento di 'eval' (chiamata indiretta vs. diretta). Vedi anche: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function --- * "Le funzioni create con il costruttore Function non creano chiusure ai loro contesti di creazione; sempre vengono creati nell'ambito globale."* –
La domanda n. 2 è più di una domanda filosofica" se un albero cade in una foresta " – JJJ