2011-03-13 25 views
16

Tengo una función con dos parámetros, por ejemplo function (a,b). Quiero dentro de la función, tomar el valor de b y reemplazarlo con c. Estaba pensando en algo como $(b).replaceWith(c), pero no funcionó. Sé que puedo crear una nueva variable dentro de la función con el nuevo valor, pero ¿es posible cambiar el valor de b en sí? Es algo como esto posible. ¿O son los parámetros establecidos en piedra?¿Es posible cambiar el valor del parámetro de la función?

Déjame intentar explicar lo que estoy tratando de hacer. Hay tres funciones, una función general y luego dos funciones dentro de ella que se desencadenan mediante un evento de alternancia. Y quiero que la segunda función haga algo para obtener un valor y pasarlo a la tercera función. Así que aquí sería el código

function(a,b){ 

    $('selector').toggle(

     //I want this to gather a value and store it in a variable 
     function(){}, 

     //and I want this to accept the variable and value from the previous function 
     function(){} 
    )} 

La única manera que puedo pensar en hacer esto es agregar un parámetro c de la función general y luego modificarlo con la primera función y tener el nuevo valor de pasar a la segunda función.

+0

Esto no está funcionando?!?! 'var value_b = b; b = c; '? – Cipi

+0

¿Es esta una pregunta general de JavaScript o hay algo específico de jQuery que no se haya mencionado? – BoltClock

+0

es una pregunta general sobre el alcance de javascript/jquery/variable supongo – Ben

Respuesta

26

No se puede pasar explícitamente por referencia en JavaScript; sin embargo, si b fuera un objeto, y en su función modificó la propiedad b, el cambio se reflejará en el alcance de la llamada.

Si necesita hacer esto con las primitivas necesita devolver el nuevo valor:

function increaseB(b) { 
    // Or in one line, return b + 1; 
    var c = b + 1; 
    return c; 
} 

var b = 3; 
b = increaseB(b); // 4 
+0

+1 para explicar por qué '$ (b) .replaceWith (c)' no funciona –

+0

Por supuesto, cuando pasa un objeto, de hecho está pasando por referencia. Sin embargo, los primitivos se pasan por valor, de ahí el problema. Encapsula tu primitiva en un objeto y debes establecerlo. –

+3

@New Guy, eso no es verdad. Está pasando por valor en cualquier caso, pero para objetos el valor es un tipo de referencia. Aquí hay una buena respuesta SO que lo discute: http://stackoverflow.com/questions/518000/is-javascript-is-a-pass-by-reference-or-pass-by-value-language/5314911#5314911. Intenta implementar $ (b) .replaceWith (c) y luego verifica que no funcione. –

0
b = c; // very little is set in stone in javascript 
-1

Qué quiere decir:

// fun is Your actual function (a,b) 

var actualFunction = fun; 

fun = function (a,b){ 
    var c = 10; 
    actualFunction(a,c); 
} 

Voy a explicar lo que está pasando onhere: Usted está creando una variable (actualFunction) y deje que se mantenga puntero a su función (a, b) (llamado aquí "divertido"). Luego está configurando una nueva definición de "diversión", por lo que está llamando a la anterior con los parámetros que desea.

No estoy muy seguro de si funciona sin excepciones, pero por favor pruébenos y háganos saber.

+0

La diversión no está definida en la primera línea, por lo que la función real tampoco está definida ... ¿y tu código debería arrojar una excepción? – Cipi

+0

Mi suposición era que esa función benéfica era la que Ben estaba tomando. Por lo tanto, no está indefinido. Intente ejecutar esto (está funcionando): función f1() { alert ('hello'); } function f2() { alert ('world'); } f1(); var holder = f1; f1 = f2; f1() –

0

Puede reemplazar el valor:

function myFunc() { 
    var a = 1, b = 2, c = 3; 

    function changeB(a, b) { 
     b = c; 
    } 

    changeB(a, b);  
} 
1

Al pasar un objeto, que está pasando una referencia a ese objeto Entonces, al modificar un objeto que pasó a una función, está modificando ese objeto original. Por lo tanto, puede crear un objeto muy simple que contenga una sola variable que le permita llevar el valor de una función a la siguiente.

Hay una cosa que debe tenerse en cuenta acerca de la forma en que está poniendo estas llamadas a la función en la lista de parámetros de otra función. No estoy seguro de cuál es el orden de ejecución para evaluar una lista de parámetros. Quizás alguien que sepa más sobre Javascript pueda responder eso. Sin embargo, no todos los idiomas evaluarán una lista de parámetros de izquierda a derecha, lo que significa que puede encontrar que la segunda función se ejecuta antes que la primera. Sin embargo, una vez más, no estoy seguro del orden de ejecución de Javascript, por lo que puede no ser una preocupación.

function(a,b){ 
    var object_c = { 
     c: 10 
    }; 

    $('selector').toggle(

    //send object_c in to gather a value and store it in the "c" field 
    function(object_c){}, 

    //send the same object_c object into the second function 
    function(object_c){} 
)} 
5

No se puede cambiar el valor de un número entero o una cadena en JavaScript PERO puede cambiar el valor de los atributos de un objeto, por ejemplo,

function change(x){ 
x.x=2; 
} 

cuando la llamada con

var y = {x:1}; 
change(y); 

hará yx = 2;

0

Si la variable está en el ámbito mundial, se puede establecer la siguiente manera:

function modify(name,newVal){ 
    window[name] = newVal; 
} 

A continuación, intente esto:

var foo = 10; 
modify('foo','bar'); 
console.log(foo); // bar 
+1

Esto es muy interesante. – viery365

Cuestiones relacionadas