¿Cómo tienen acceso las funciones a las variables de script cuando esas variables de script no se pasan a la función?Tengo una función sin parámetros de entrada, que usa una variable de script.
Según tengo entendido con otros lenguajes de programación, la función solo debería tener acceso a las variables pasadas o definidas en la función.
Cuando ejecuto el script a continuación, devuelve 14. ¿Por qué funciona esto? ¿Hay alguna manera de hacer que las variables utilizadas por la función sean más exclusivas?
scriptVar = 14;
myFunction = function({},{default local},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();Gracias por tu ayuda.
Modelado Estadístico AvanzadoAutomatización y secuencias de comandosAcceso a los datosDiseño de experimentosIngeniería de Calidad y ProcesosRe: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?Ah, eso está claro ahora.Supongo que eso muestra la frecuencia con la que no use los nombres predeterminados aquí (1)...
Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?Gracias por captar mi error. quise decir eso las variables son globales por defecto .
Cambió las cosas cuando invocó el espacio de nombres Aquí. Modifiqué su secuencia de comandos para ilustrar el espacio de nombres global en efecto:
// Names Default To Here( 1 );
Delete Symbols();
fn1 = Function( {x},
fn2 = Function( {x},
2*x;
);
5*fn2(x);
);
Show Symbols();
y = fn1(10);
Show( y );
Show Symbols();
El registro muestra:
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
// 1 Global
y = 100;
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
fn2 = Function( {x}, 2 * x );
y = 100;
// 3 Global
Entonces fn2 también es una variable global, por defecto. Debe indicar que prefiere la excepción, una variable local, cuando sea necesario.
Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?Para controlar el alcance de las variables en las funciones, usamos la declaración {default local}.Pero las variables fuera de las funciones tienen un alcance global; es por eso que 'scriptvar' estaba visible para la función.Para evitar ese comportamiento, usamos la declaración 'los nombres predeterminados son aquí (1)'.
Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?Si entiendo la pregunta de Kelly, el objetivo es evitar el uso involuntario de variables globales, en lugar de que ese sea el comportamiento deseado.
¿Qué quiere decir con que las funciones son globales por defecto?Entendí que las funciones persisten solo mientras exista el espacio de nombres que las contiene, por lo que en el ejemplo a continuación, fn1 se almacena en el espacio de nombres aquí (o global en ausencia de nombres predeterminados aquí (1)) pero fn2 desaparece tan pronto como finaliza fn1 ejecutándose, por lo que se vuelve a crear cada vez que se ejecuta fn1.
names default to here(1);
delete symbols();
fn1 = function({},
fn2 = function({},
1
);
);
show symbols();
/*
Returns:
// Here
fn1 = Function( {},
fn2 = Function( {}, 1 )
);
// 1 Here<BR />*/
Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?¡Gracias!
Agradezco la explicación y los ejemplos que puedo usar como alternativas.Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?Las variables son globales de forma predeterminada y persisten después de que se ejecuta el script.
¿Por qué usa una variable global en la expresión para la definición de la función? Si necesita el valor, use un parámetro de función y pase el argumento cuando llame a la función.
Re: ¿Cómo tienen acceso las funciones a las variables de secuencia de comandos cuando esas variables de secuencia de comandos no se pasan a la función?La función primero busca en su propio espacio de nombres para resolver símbolos/variables, luego, si no encuentra una variable, busca progresivamente en los espacios de nombres principales para encontrar un valor antes de devolver un valor faltante.Tenga en cuenta que si la variable se creara dentro de la función, no sería accesible en el resto de su código.Estoy de acuerdo en que esta es una fuente común de errores.
Puede usar la función local para asegurarse de que está trabajando con una variable local.Esto suele ser útil para variables de iteración comunes como 'i', que podrían usarse sin darse cuenta en bucles for anidados. Aquí hay un ejemplo;
scriptVar = 14;
myFunction = function({},{default local},
local({scriptVar},
functionVar = scriptVar;
return(functionVar);
);
);
returnVar = myFunction(); //Returns emptyDado que declarar variables locales en funciones es un caso de uso común, este comportamiento está integrado en la función 'función':
scriptVar = 14;
myFunction = function({}, {scriptVar = .},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();