2011-03-13 77 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

相關問題