2011-03-13 46 views
16

我有一个函数有两个参数,例如function (a,b)。我想在函数内取b的值,并用c代替。我在想像$(b).replaceWith(c)之类的东西,但它没有奏效。我知道我可以用新值在函数内创建一个新变量,但是可以更改b本身的值吗?是这样的可能。或者是参数设置为石头?是否可以更改函数参数的值?

让我试着解释我正在尝试做什么。有三种功能,一种是总体功能,另一种是由切换事件触发的两种功能。我想第二个函数做一些事情来获得一个值并将它传递给第三个函数。因此,这里将是代码

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(){} 
    )} 

我能想到这样做的唯一方法是添加参数下的总体功能,然后用第一个功能修改并有新的价值传递给第二功能。

+0

这不是工作?!?! 'var value_b = b; b = c;'? – Cipi 2011-03-13 20:31:13

+0

这是一个普通的JavaScript问题,还是有没有提到的任何jQuery特有的? – BoltClock 2011-03-13 20:34:25

+0

以及它的一个通用的javascript/jquery /变量范围问题我想 – Ben 2011-03-13 20:47:08

回答

26

您无法在JavaScript中通过引用明确传递;但是,如果b是一个对象,并且在您的函数中修改了b的属性,则更改将反映在调用范围中。

如果需要使用原语要做到这一点,你需要返回新值:

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解释为什么'$(b).replaceWith(c)'不起作用 – 2011-03-13 21:14:44

+0

当然,当你传递一个对象时,你实际上是通过引用传递的。然而,原始物质因价值而传递,因此是问题。将你的原语封装到一个对象中,你应该被设置。 – 2011-03-13 21:23:23

+3

@新人,那不是真的。无论哪种情况,您都会传递值,但对于对象,值是引用类型。这是一个很好的答案,讨论它:http://stackoverflow.com/questions/518000/is-javascript-is-a-pass-by-reference-or-pass-by-value-language/5314911#5314911。尝试实现$(b).replaceWith(c),然后看到它不起作用。 – 2011-03-20 20:20:31

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

你的意思是:

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

var actualFunction = fun; 

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

让我解释一下这是怎么回事onhere:您正在创建一个变量(actualFunction),并让它保持指向你的功能(A,B)(这里命名“好玩”)。然后,您正在为“有趣”设置新的定义,因此它会用您喜欢的参数调用旧的定义。

我不太确定它是否无例外地运行,但请尝试一下并让我们知道。

+0

乐趣是第一行未定义,所以actualFunction也未定义...和你的代码应该抛出异常? – Cipi 2011-03-13 20:33:12

+0

我的假设是,有趣的是本正在采取的功能。所以它不是没有定义的。尝试执行此操作(它的工作): function f1(){ alert('hello'); } function f2(){ alert('world'); } f1(); var holder = f1; f1 = f2; f1() – 2011-03-13 20:43:57

0

您可以替换值:

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

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

    changeB(a, b);  
} 
1

当传递对象,你传递一个参考到那个对象。因此,在修改传递给函数的对象时,您正在修改该原始对象。因此,您可以创建一个包含单个变量的非常简单的对象,该变量允许您将值从一个函数传递到另一个函数。

关于将这些函数调用放入另一个函数的参数列表的方式,有一点需要注意。我不确定执行的顺序是评估参数列表。也许对JavaScript有更多了解的人可以回答这个问题。但是,并非所有语言都会从左到右评估参数列表,这意味着您可能会发现第二个函数在第一个函数之前执行。虽然如此,我不确定JavaScript的执行顺序,所以这可能不是问题。

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

你不能改变一个整数值或在JavaScript 一个字符串,但可以

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

打电话时与

var y = {x:1}; 
change(y); 
改变一个对象的属性值,例如

会使yx = 2;

0

如果变量是在全球范围内,你可以按照如下设置:

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

那么,试试这个:

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

这非常有趣。 – viery365 2017-03-30 03:37:27

相关问题