Bağımsız değişkenleri başka bir javascript işlevine iletme


386

Aşağıdakileri başarı ile denedim:

function a(args){
    b(arguments);
}

function b(args){
    // arguments are lost?
}

a(1,2,3);

Fonksiyon a'da, bir argüman dizisine erişmek için arguments anahtar sözcüğünü kullanabilirim, fonksiyon b'de bunlar kaybolur. Yapmaya çalıştığım gibi başka bir javascript işlevine argümanlar geçirmenin bir yolu var mı?


3
@ BobStein-VisiBone Kabul Edildi. Ayrıca, argumentsbunun aslında bir dizi olmadığını (daha ziyade dizi benzeri anlambilimi uygulayan bir nesne ) ve bu nedenle ilk bakışta gerçek bir dizi ile aynı şekilde kullanılıp kullanılamayacağını tamamen açık olmadığını unutmayın.
Jules

@Jules hala bunca yıldan sonra yeniden açmak için oy kullanıyor . Diğer insanların değerli işlerini yakmanın rozeti nedir? Bunlardan birçoğu dolaşacak.
Bob Stein

Yanıtlar:


542

Aşağıdaki gibi işlevlerde .apply()aynı erişime sahip olmak için kullanın :argumentsb

function a(){
    b.apply(null, arguments);
}
function b(){
   alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);​

Burada test edebilirsiniz .


21
@Brett - Bir diziye kopyalayabilir ve daha sonra geçirmeden önce değiştirebilirsiniz, örneğin:var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
Nick Craver

18
ancak bunun applygibi kullanılması b(örneğin bir nesnenin içsel bir
işleviyse

3
@vsync iyi bir nokta, ama problemi çözmek kolaydır: Uygulanacak ilk argüman olarak nesneyi iletin.
Tad Lispy

11
"argümanlar" ve "argümanları" birlikte kullanmak mantıklı değil ...
dostum

3
Ama sonra "bu" b'nin orijinali dışında bir şeyle değiştirilebilir.
trusktr

223

Forma operatörü

Forma işleci, bir ifadenin (işlev çağrıları için) veya birden çok öğenin (dizi değişmezleri için) beklendiği yerlerde bir ifadenin genişletilmesine izin verir.

ECMAScript ES6, bunu daha pratik bir şekilde yapmanızı sağlayan yeni bir operatör ekledi: ... Spread Operator .

applyYöntemi kullanmadan örnek :

function a(...args){
  b(...args);
  b(6, ...args, 8) // You can even add more elements
}
function b(){
  console.log(arguments)
}

a(1, 2, 3)

Note Tarayıcınız hala ES5 kullanıyorsa bu snippet bir sözdizimi hatası döndürür.

Editörün notu: pasajı kullanımları yana console.log(), sen gerekir tarayıcınızın JS konsolunu açmak sonucunu görmek için - olacak hiçbir sayfa içi sonucu.

Bu sonucu gösterecektir:

Spread operatörü argümanları örneğinin görüntüsü

Kısacası, yayılma operatörü diziler kullanıyorsanız farklı amaçlar için kullanılabilir, bu nedenle işlev bağımsız değişkenleri için de kullanılabilir, resmi dokümanlarda açıklanan benzer bir örneği görebilirsiniz: Dinlenme parametreleri


6
Bu çok hoş bir operatör ve bunu kullanmak için sabırsızlanıyorum. Ancak, henüz gerçekleşmeyecek. Dağıtım operatörünü zaten destekleyen tek tarayıcı şu anda FF'dir. Tam ve güncel bir veri için uyumluluk tablosuna bakın: kangax.github.io/compat-table/es6/#spread_%28...%29_operator
TMG

10
Neden kullanılmamalıdır? Babil ile taşınması nispeten kolaydır, tüm yeni özellikleri ve daha eski tarayıcılarla çok daha fazla uyumluluğu elde edersiniz.
adgelbfish

Bu, ilk işleçten daha iyidir çünkü ok operatörü ile tanımlanan işlevde çalışır.
19'da sarfata

Sen ihtiyacım yok ...argsiçinde aişlevi. Sadece argümanları olmadan bir işlev yapmak ve bunları geçebilir bile...arguments
cronoklee

1
Bu cevabı okuyan herkese: @ cronoklee'nin yorumunun aksine, açıkça belirtin ...argsa , iç içe geçmiş işlevleriniz varsa girdi olarak önemli olabilir.
Arshia001

81

Diğer cevaplar malzemelerinin hiçbiri orijinal argümanlar olduğunu çok açıklama vardır ancak orijinal konumunda, hala kullanılabilirarguments nesne.

argumentsNesne işlevine mesafede her gerçek parametre için bir eleman içerir. Aradığınızda anumaraları: Eğer üç argüman tedarik 1, 2ve, 3. Yani, argumentsiçerir [1, 2, 3].

function a(args){
    console.log(arguments) // [1, 2, 3]
    b(arguments);
}

Aradığınızda b, ancak, tam olarak geçmesi bir argüman: a'in argumentsnesne. Yani argumentsiçerir [[1, 2, 3]](yani bir element, a'in argumentsözgün argümanlar içeren özelliklere sahip bir amacı, a).

function b(args){
    // arguments are lost?
    console.log(arguments) // [[1, 2, 3]]
}

a(1,2,3);

@ Nick'in gösterdiği gibi, applybir set sağlamak için kullanabilirsinizarguments çağrıda nesne .

Aşağıdakiler aynı sonucu verir:

function a(args){
    b(arguments[0], arguments[1], arguments[2]); // three arguments
}

Ancak applygenel durumda doğru çözümdür.


Hep geçerlerse thisiçin apply?
Flimm

1
@ Flimm — evet, argümanlar ikinci argüman olduğundan, ilk argüman için bir şeyler olmalı ( null olabilir ).
RobG

0

bunu dene

function global_func(...args){
  for(let i of args){
    console.log(i)
  }
}


global_func('task_name', 'action', [{x: 'x'},{x: 'x'}], {x: 'x'}, ['x1','x2'], 1, null, undefined, false, true)




//task_name
//action
//(2) [{...},
//    {...}]
//    {
//        x:"x"
//    }
//(2) [
//        "x1",
//        "x2"
//    ]
//1
//null
//undefined
//false
//true
//func
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.