javascript - change - title css
JavaScript pasa el alcance a otra funciĆ³n (11)
¿Es posible pasar de alguna manera el alcance de una función a otra?
Por ejemplo,
function a(){
var x = 5;
var obj = {..};
b(<my-scope>);
}
function b(){
//access x or obj....
}
Preferiría acceder a las variables directamente, es decir, no usar nada como this.a
o this.obj
, sino simplemente usar x
u obj
directamente.
¿qué hay de usar bind
function funcA(param) {
var bscoped = funcB.bind(this);
bscoped(param1,param2...)
}
Como han dicho otros, no se puede pasar un alcance así. Sin embargo, puede definir las variables de alcance de forma adecuada mediante la ejecución automática de funciones anónimas (o la ejecución inmediata si es pedante):
(function(){
var x = 5;
var obj = {x:x};
module.a = function(){
module.b();
};
module.b = function(){
alert(obj.x);
};
}());
a();
Creo que lo más simple que puedes hacer es pasar las variables de un alcance a una función fuera de ese alcance. Si pasa por referencia (como Objetos), b tiene ''acceso'' (vea obj.someprop en lo siguiente):
function a(){
var x = 5;
var obj = {someprop : 1};
b(x, obj);
alert(x); => 5
alert(obj.someprop); //=> ''otherval''
}
function b(aa,obj){
x += 1; //won''t affect x in function a, because x is passed by value
obj.someprop = ''otherval''; //change obj in function a, is passed by reference
}
El alcance es creado por funciones, y un alcance permanece con una función, por lo que lo más cercano a lo que está pidiendo es pasar una función de a()
a b()
, y esa función seguirá teniendo acceso a la función. variables de ámbito de a()
.
function a(){
var x = 5;
var obj = {..};
b(function() { /* this can access var x and var obj */ });
}
function b( fn ){
fn(); // the function passed still has access to the variables from a()
}
Si bien b()
no tiene acceso directo a las variables que la función pasó, los tipos de datos donde se pasa una referencia, como un Objeto, pueden accederse si la función pasada devuelve ese objeto.
function a(){
var x = 5;
var obj = {..};
b(function() { x++; return obj; });
}
function b( fn ){
var obj = fn();
obj.some_prop = ''some value''; // This new property will be updated in the
// same obj referenced in a()
}
Has intentado algo como ésto:
function a(){
var x = 5;
var obj = {..};
b(this);
}
function b(fnA){
//access x or obj....
fnA.obj = 6;
}
Si puede soportar la función B como método A, haga lo siguiente:
function a(){
var x = 5;
var obj = {..};
b(this);
this.b = function (){
// "this" keyword is still === function a
}
}
La única manera de obtener acceso realmente al alcance privado de la función a es declarar b
dentro de a
modo que se forme un cierre que permita el acceso implícito a las variables de a.
Aquí hay algunas opciones para usted.
Acceso directo
Declara
b
dentro dea
.function a() { var x = 5, obj = {}; function b(){ // access x or obj... } b(); } a();
Si no quiere
b
dentro dea
, entonces podría tenerlos dentro de un ámbito de contenedor más grande:function container() { var x, obj; function a(){ x = 5; obj = {..}; b(); } function b(){ // access x or obj... } } container.a();
Estas son las únicas formas en que podrá usar las variables de a directamente en b
sin un código adicional para mover las cosas. Si está satisfecho con un poco de "ayuda" y / o direccionamiento indirecto, aquí hay algunas ideas más.
Acceso indirecto
Solo puede pasar las variables como parámetros, pero no tendrá acceso de escritura excepto a las propiedades de los objetos:
function a() { var x = 5, obj = {}; b(x, obj); } function b(x, obj){ // access x or obj... // changing x here won''t change x in a, but you can modify properties of obj } a();
Como una variación de esto, puede obtener acceso de escritura pasando valores actualizados de nuevo a
a
gusta:// in a: var ret = b(x, obj); x = ret.x; obj = ret.obj; // in b: return {x : x, obj : obj};
Podría pasar un objeto con captadores y definidores que pueden acceder
a
las variables privadas de un:function a(){ var x = 5, obj = {..}, translator = { getX : function() {return x;}, setX : function(value) {x = value;}, getObj : function() {return obj;}, setObj : function(value) {obj = value;} }; b(translator); } function b(t){ var x = t.getX(), obj = t.getObj(); // use x or obj... t.setX(x); t.setObj(obj); // or you can just directly modify obj''s properties: obj.key = value; } a();
Los captadores y definidores pueden ser públicos, asignados a
this
objeto dea
, pero de esta manera solo son accesibles si se entregan explícitamente desde dentro de.Y podrías poner tus variables en un objeto y pasar el objeto:
function a(){ var v = { x : 5, obj : {} }; b(v); } function b(v){ // access v.x or v.obj... // or set new local x and obj variables to these and use them. } a();
Como variación, puedes construir el objeto en el momento de la llamada:
function a(){ var x = 5, obj = {}; b({x : x, obj: obj}); } function b(v){ // access v.x or v.obj... // or set new local x and obj variables to these and use them. } a();
No puedes "pasar el alcance" ... no que yo sepa.
Puede pasar el objeto al que se refiere la función usando apply
o call
y envíe el objeto actual ( this
) como primer parámetro en lugar de solo llamar a la función:
function b(){
alert(this.x);
}
function a(){
this.x = 2;
b.call(this);
}
La única forma para que una función acceda a un determinado alcance es ser declarada en ese alcance.
Un poco complicado.
Eso llevaría a algo como:
function a(){
var x = 1;
function b(){
alert(x);
}
}
Pero eso sería una especie de derrota del propósito.
No.
Estás accediendo al objeto de alcance local. El [[Context]]
.
No puedes acceder públicamente a él.
Ahora, debido a que es node.js, deberías poder escribir un complemento de C ++ que te dé acceso al objeto [[Context]]
. Recomiendo altamente esto, ya que trae extensiones propietarias al lenguaje JavaScript.
Puede crear sus variables sin la palabra clave var
y serán globales, pero no hay forma de pasar el alcance del que soy consciente ...
function a(){
this.x = 5;
this.obj = {..};
var self = this;
b(self);
}
function b(scope){
//access x or obj....
}
function a(){
var x = 5;
var obj = {..};
var b = function()
{
document.println(x);
}
b.call();
}