एक अन्य जावास्क्रिप्ट फ़ंक्शन के लिए तर्क पास करना


386

मैंने बिना किसी सफलता के साथ कोशिश की है:

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

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

a(1,2,3);

फ़ंक्शन ए में, मैं तर्कों के सरणी का उपयोग करने के लिए तर्क कीवर्ड का उपयोग कर सकता हूं, फ़ंक्शन बी में ये खो गए हैं। वहाँ एक और जावास्क्रिप्ट समारोह में तर्क पारित करने का एक तरीका है जैसे मैं करने की कोशिश करता हूं?


3
@ BobStein-VisiBone सहमत हैं। साथ ही, ध्यान दें कि argumentsनहीं है वास्तव में एक सरणी (बल्कि एक उद्देश्य यह है कि लागू सरणी की तरह-अर्थ विज्ञान ) और इसलिए यह पूरी तरह से पहली नजर में स्पष्ट नहीं है कि क्या यह एक वास्तविक सरणी के रूप में एक ही तरीके से इस्तेमाल किया जा सकता कर सकते हैं।
जूल्स 1

@ जूल्स अभी भी इन सभी वर्षों के बाद फिर से खोलने के लिए मतदान करते हैं । अन्य लोगों के मूल्यवान कार्य को जलाने के लिए बिल्ला क्या है? आसपास जाने के लिए बहुत सारे लोग।
बॉब स्टीन

जवाबों:


542

फ़ंक्शन .apply()की समान पहुंच के लिए इसका उपयोग करें , जैसे:argumentsb

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

आप इसका परीक्षण यहां कर सकते हैं


21
@Brett - आप इसे एक सरणी में कॉपी कर सकते हैं तो हेरफेर है कि यह साथ गुजर, उदाहरण के लिए इससे पहले कि:var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
निक Craver

18
लेकिन applyइस तरह का उपयोग करने से इसका दायरा बिगड़ सकता है b(यदि यह उदाहरण के लिए किसी वस्तु का आंतरिक कार्य है)
vsync

3
@vsync अच्छा बिंदु है, लेकिन समस्या को हल करना आसान है: ऑब्जेक्ट को लागू करने के लिए पहले तर्क के रूप में पास करें।
टाड लिस्फी

11
"आर्ग" और "तर्क" का एक साथ उपयोग करने का कोई मतलब नहीं है ...
यार

3
लेकिन तब "इस" को b के मूल के अलावा किसी और चीज़ में बदला जा सकता है।
trusktr

223

फैला हुआ संचालक

स्प्रेड ऑपरेटर उन स्थानों में अभिव्यक्ति का विस्तार करने की अनुमति देता है जहां कई तर्क (फ़ंक्शन कॉल के लिए) या कई तत्व (सरणी लिटरल के लिए) अपेक्षित हैं।

ECMAScript ES6 ने एक नया ऑपरेटर जोड़ा जो आपको इसे अधिक व्यावहारिक तरीके से करने की अनुमति देता है: ... स्प्रेड ऑपरेटर

applyविधि का उपयोग किए बिना उदाहरण :

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 यदि आपका ब्राउज़र अभी भी ES5 का उपयोग करता है तो यह स्निपेट एक सिंटैक्स त्रुटि देता है।

संपादक का ध्यान दें: चूंकि स्निपेट उपयोग करता है console.log(), इसलिए आपको परिणाम देखने के लिए अपने ब्राउज़र का जेएस कंसोल खोलना होगा - कोई नहीं होगा पृष्ठ परिणाम ।

यह इस परिणाम को प्रदर्शित करेगा:

स्प्रेड ऑपरेटर तर्क की छवि उदाहरण

संक्षेप में, फैलाने वाले ऑपरेटर का उपयोग विभिन्न उद्देश्यों के लिए किया जा सकता है यदि आप सरणियों का उपयोग कर रहे हैं, तो इसका उपयोग फ़ंक्शन तर्कों के लिए भी किया जा सकता है, आप आधिकारिक डॉक्स में समझाया गया एक समान उदाहरण देख सकते हैं: बाकी पैरामीटर


6
यह एक बहुत अच्छा ऑपरेटर है और मैं इसका उपयोग करने के लिए वास्तव में उत्सुक हूं। हालाँकि, यह अभी तक नहीं होगा। एकमात्र ब्राउज़र जो पहले से ही प्रसार ऑपरेटर का समर्थन करता है, वह इस समय एफएफ है। संपूर्ण डेटा के लिए संगतता तालिका देखें: तिथि डेटा: kangax.github.io/compat-table/es6/#spread_%28...%29_operator
TMG

10
इसका उपयोग क्यों नहीं किया जाना चाहिए? बेबल के साथ ट्रांसपाइल करना अपेक्षाकृत आसान है, आपको सभी नई सुविधाएँ मिलती हैं, और पुराने ब्राउज़रों के साथ अधिक अनुकूलता।
adgelbfish

यह पहले समाधान से बेहतर है क्योंकि यह तीर ऑपरेटर के साथ परिभाषित फ़ंक्शन में काम करता है।
सरफता

आप की जरूरत नहीं है ...argsa समारोह में । आप बस बिना किसी तर्क के एक समारोह बना सकते हैं और उन्हें अपने bसाथ पारित कर सकते हैं...arguments
cronoklee

1
इस उत्तर को पढ़ने वाले किसी व्यक्ति के लिए: @ cronoklee की टिप्पणी के विपरीत, स्पष्ट रूप से निर्दिष्ट करना ...args कि aयदि आपके पास नेस्टेड फ़ंक्शन हैं, तो यह महत्वपूर्ण हो सकता है।
अर्शिया001

81

स्पष्टीकरण अन्य उत्तर की आपूर्ति में से कोई भी है कि है कि मूल तर्क हैं अभी भी उपलब्ध है, लेकिन में मूल स्थिति में नहींarguments वस्तु।

argumentsवस्तु प्रत्येक वास्तविक कार्य करने के लिए प्रदान की पैरामीटर के लिए एक तत्व होता है। जब आप फोन aनंबर: आप तीन तर्कों की आपूर्ति 1, 2और, 3। तो, argumentsशामिल है [1, 2, 3]

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

जब आप कॉल करते हैं b, हालांकि, आप बिल्कुल एक पास करते हैं तर्क: aकी argumentsवस्तु। तो argumentsशामिल [[1, 2, 3]](यानी एक तत्व है, जो है aकी argumentsवस्तु है, जो मूल तर्क युक्त गुण है a)।

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

a(1,2,3);

जैसा कि @ नोट प्रदर्शित किया गया है, आप applyएक सेट प्रदान करने के लिए उपयोग कर सकते हैंarguments कॉल में ऑब्जेक्ट ।

निम्नलिखित समान परिणाम प्राप्त करता है:

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

लेकिन applyसामान्य मामले में सही समाधान है।


आप हमेशा से पारित करना चाहिए thisकरने के लिए apply?
फ्लिमल

1
@ फ्लिम- हां, चूंकि तर्क दूसरे तर्क हैं, पहले तर्क के लिए कुछ होना चाहिए (यह शून्य हो सकता है )।
रॉब

0

इसे इस्तेमाल करे

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.