2011-03-13 33 views
16

İki parametreli bir işlev var, örneğin function (a,b). Fonksiyonun içinde kalmak istiyorum, b'nin değerini al ve bunu c ile değiştir. $(b).replaceWith(c) gibi bir şey düşünüyordum, ama işe yaramadı. Yeni değerle işlev içinde yeni bir değişken oluşturabileceğimi biliyorum, ama b'nin değerini değiştirmek mümkün mü? Böyle bir şey mümkün mü? Yoksa taşa yerleştirilmiş parametreler mi?İşlev parametresinin değerini değiştirmek mümkün mü?

Yapmaya çalıştığım şeyi açıklamaya çalışalım. Üç işlev vardır, tek bir işlev ve sonra da geçiş olayı tarafından tetiklenen iki işlev vardır. Ve ikinci fonksiyonun bir değer elde etmek ve üçüncü işleve aktarmak için bir şeyler yapmasını istiyorum. Yani burada kod bunu yapmanın düşünüyorum tek yolu kapsayıcı işlevi için bir parametre c ekleyin ve sonra ilk fonksiyonu ile değiştirmek ve yeni değer ikinciye geçmek sahip olmaktır

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

olurdu işlevi.

+0

?!?! 'var value_b = b; b = c; '? – Cipi

+0

Bu genel bir JavaScript sorusu mu, yoksa belirtilmemiş jQuery'e özel bir şey var mı? – BoltClock

+0

iyi bir javascript/jquery/variable kapsamı sorusu var sanırım – Ben

cevap

26

JavaScript'te açık bir şekilde başvuruda bulunamazsınız; Ancak, b bir nesne ise ve işlevinizde b'un özelliğini değiştirdiyseniz, değişiklik arama kapsamına yansıtılır.

Eğer yeni değer döndürmek için gereken ilkel ile bunu gerekirse: Sen değerini değiştirebilir

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 nedenini açıklamak için $ (b) .replaceWith (c) 'çalışmaz –

+0

Tabii ki bir nesneyi ilettiğinizde, aslında referans olarak geçiyorsunuz demektir. Ancak, ilkel maddeler bu nedenle değere göre geçer. İlkeliğinizi bir nesneye kapsülleyecek ve ayarlanmalısınız. –

+3

@New Guy, bu doğru değil. Her iki durumda da değere göre geçiyorsunuz, ancak nesneler için değer bir referans türüdür. İşte bunu tartışan iyi bir cevap: http://stackoverflow.com/questions/518000/is-javascript-is-a-pass-by-reference-or-pass-by-value-language/5314911#5314911. $ (B) .replaceWith (c) 'yi uygulamaya çalışın ve sonra çalışmadığını görün. –

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

Yani musunuz:

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

var actualFunction = fun; 

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

beni onHeres neler olduğunu açıklayalım: Bir değişkeni (actualFunction) oluştururken ve (a, b) (burada adlandırılmış Kişisel işlevine işaretçisi tutun izin "eğlence"). Sonra "eğlence" için yeni bir tanım oluşturuyorsunuz, böylece eski olanı istediğiniz parametrelerle çağırıyorsunuz.

İstisnasız çalışıp çalışmadığından emin değilim, ancak lütfen deneyin ve bize bildirin.

+0

eğlenceli ilk satırda tanımsızdır, bu yüzden gerçek işlev de tanımsızdır ... ve kodunuz istisna atmalıdır? – Cipi

+0

Benim varsayımım, bu eğlencenin Ben'in üstlendiği işlev olduğuydu. Yani tanımsız değil. Bunu çalıştırmayı deneyin (çalışıyor): function f1() { alert ('hello'); } işlev f2() { uyarısı ('dünya'); } f1(); var holder = f1; f1 = f2; f1() –

0

: Bir nesneyi geçerken

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

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

    changeB(a, b);  
} 
1

, referans geçiyoruz bu nesneye Yani bir işleve geçirilmiş bir nesneyi değiştirirken, o orijinal nesneyi değiştiriyorsunuz. Bu nedenle, değeri bir işlevden diğerine taşımanızı sağlayan tek bir değişken içeren çok basit bir nesne oluşturabilirsiniz.

Bu işlev çağrılarını başka bir işlevin parametre listesine koyma şeklinizle ilgili dikkat edilmesi gereken bir şey var. Bir parametre listesini değerlendirmek için yürütme sırasının ne olduğundan emin değilim. Belki de Javascript hakkında daha fazla bilgi sahibi olan biri buna cevap verebilir. Ancak, tüm diller, soldan sağa bir parametre listesi değerlendirmez, bu da ikinci fonksiyonun ilk önce gerçekleştirileceğini bulabileceğiniz anlamına gelir. Yine de, ben Javascript için yürütme sırasından emin değilim, bu yüzden bir endişe olmayabilir.

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

Sen bir tamsayı değerini veya JavaScript bir dize değiştiremezsiniz AMA sen

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

zaman çağrı

var y = {x:1}; 
change(y); 
ile örneğin bir nesnenin niteliklerini değerini değiştirebilir

yx = 2; Değişken Genel kapsamda ise şöyle

0

, bunu ayarlayabilirsiniz:

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

Sonra, bu deneyin: Bu işe yaramıyor

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

Bu çok ilginç. – viery365

İlgili konular