Como os fechamentos e escopos são representados em tempo de execução em JavaScript

Essa é principalmente uma questão de curiosidade. Considere as seguintes funções

var closure ;
function f0() {
    var x = new BigObject() ;
    var y = 0 ;
    closure = function(){ return 7; } ;
}
function f1() {
    var x = BigObject() ;
    closure =  (function(y) { return function(){return y++;} ; })(0) ;
}
function f2() {
    var x = BigObject() ;
    var y = 0 ;
    closure = function(){ return y++ ; } ;
}

Em todos os casos, após a execução da função, acho que não há como acessarx e então o BigObject pode ser coletado como lixo, desde quex é a última referência a ele. Um intérprete de mente simples capturaria toda a cadeia de escopo sempre que uma expressão de função for avaliada. Por um lado, você precisa fazer isso para fazer chamadas para eval work - exemplo abaixo). Uma implementação mais inteligente pode evitar isso em f0 e f1. Uma implementação ainda mais inteligente permitiriay a ser retido, mas nãox, conforme necessário para que o f2 seja eficient

inha pergunta é: como os modernos mecanismos JavaScript (JaegerMonkey, V8 etc.) lidam com essas situaçõe

or fim, aqui está um exemplo que mostra que as variáveis podem precisar ser mantidas, mesmo que nunca sejam mencionadas na função aninhad

var f = (function(x, y){ return function(str) { return eval(str) ; } } )(4, 5) ;
f("1+2") ; // 3
f("x+y") ; // 9
f("x=6") ;
f("x+y") ; // 11

o entanto, existem restrições que impedem que alguém se esgueire em uma chamada para avaliar de maneiras que podem ser perdidas pelo compilado

questionAnswers(2)

yourAnswerToTheQuestion