2010-12-30 12 views
9
(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); 
     } 
    }; 
}()).f(2); 

Supongamos que no quiero cambiar el nombre de ninguna variable. No hay forma de que, desde el interior de f, acceda a la variable x, que se declaró primero, ¿no?¿Variable de acceso en el ámbito externo?

+1

que podría exponer a la variable con un método – hunter

+1

¿Por qué no se desea cambiar el nombre de cualquiera de las variables? – strager

+1

El parámetro 'x' * sombrea * la variable' x'. Como en muchos otros lenguajes de programación (que a veces se pueden resolver, pero en este ejemplo, no). –

Respuesta

11

correcta. Como tiene un x diferente en function (x), cualquier intento de acceder a x lo obtendrá (el alcance más cercano). Bloquea el acceso a cualquier x en un ámbito más amplio.

1

Se podía volver la variable con la función:

(function() { 
    var x = 1; 
    return { 
     f: function() { 
      alert(this.x); 
     }, 
     x:x 
    }; 
}()).f(); 
1

No hay manera de, desde dentro f, acceder a la variable x, que fue declarado por primera vez

No, no lo hay. El alcance interno x oculta el alcance exterior x.

var closure = (function() { 
    var local = {}; 
    local.x = 1; 
    return { 
     f: function (x) { 
      alert(x || local.x); 
     } 
    }; 
}()); 

closure.f(2); // alerts "2" 
closure.f(); // alerts "1" 

No se puede tener una variable interna llamada "local", por supuesto. ;-)

4

Esto le permite usar tanto x (1) como x (2) al mismo tiempo.

(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); // paramter (=2) 
      alert(this.x); // scoped variable (=1) 
     }, 
     x:x 
    }; 
}()).f(2); 
+0

Un enfoque interesante. ¡Gracias! Sin embargo, en el caso de la vida real, no quiero exponer esa 'x'. – feklee

0

Consciente de llamadas asíncronas implícitos que te hacen pensar que no se puede acceder de la variable de alcance externo:

result = {} 
jQuery.ajax({ // it is a async call! 
    url: "/some/url", 
    success: function(data) { 
     result = JSON.parse(data); 
    } 
}); 

return result; // Result will be still {} because function returns before request has done. 
Cuestiones relacionadas