2012-03-09 13 views
21

यह जिज्ञासा से बाहर है, लेकिन क्या आप में से कोई एक विचार है कि यह कोड क्यों काम नहीं करेगा?प्रत्येक के लिए पैरामीटर के रूप में पारित होने पर console.log क्यों काम नहीं करता है?

[1, 2, 3, 4, 5].forEach(function(n) { console.log(n) }); 

तो ...:

[1, 2, 3, 4, 5].forEach(console.log); 

// Prints 'Uncaught TypeError: Illegal invocation' in Chrome 

दूसरी ओर, इस अच्छा काम करने लगता है?

+4

आपके पास गलत 'यह' है। वास्तव में – SLaks

+0

। मैं इसे जवाब दूंगा, मैं इतना मूर्ख हूं –

+0

क्या इसे अभी हटाया जा सकता है? यह वास्तव में उपयोगी नहीं है =/ –

उत्तर

8

असल रूप में @SLaks ने कहा, console.log आंतरिक this का उपयोग कर किया जा रहा है और जब यह एक पैरामीटर के रूप में पारित this है अब सरणी उदाहरण को दर्शाता है।

कि के लिए वैकल्पिक हल बस है:

var c = console.log.bind(console); [1,2,3,4,5].forEach(c);

+2

नोड v6 –

-4

मैं नहीं कह सकता कि मैंने वाक्यविन्यास देखा है, लेकिन मेरा अनुमान है क्योंकि लॉग कंसोल में लॉग इन करने के लिए संदेश/ऑब्जेक्ट/आदि होने के कारण पैरामीटर की अपेक्षा करता है।

पहले उदाहरण में, आप बस के लिए फ़ंक्शन संदर्भ पास कर रहे हैं, जो ठीक है यदि आपका फ़ंक्शन पैरामीटर की अपेक्षा नहीं करता है जो फ़ंक्शन को अपेक्षित व्यवहार करता है। दूसरे उदाहरण में आप ई में पास करते हैं और फिर इसे लॉग करते हैं।

+2

गलत; 'प्रत्येक के लिए एक पैरामीटर गुजर रहा है। – SLaks

+0

जिस बिंदु को मैं बनाने की कोशिश कर रहा था वह यह है कि पैरामीटर को console.log पर पास करने की आवश्यकता है, यानी console.log (_e_) – thescientist

+1

हां, और यह वही होता है। फ़ंक्शन अभिव्यक्ति से किसी फ़ंक्शन और किसी संपत्ति से फ़ंक्शन के बीच कोई अंतर नहीं है। – SLaks

11

यह काम करता है:

[1,2,3,4,5].forEach(console.log.bind(console)); 
+2

महान उत्तर, मैं इसे स्वीकार करने के रूप में चिह्नित करना चाहता हूं लेकिन क्या आप समझा सकते हैं (उन लोगों के लिए जो नहीं जानते हैं) आपका कोड क्या करता है? यदि नहीं, तो मुझे डर है कि मुझे मेरा स्वीकार करना होगा जो थोड़ा अधिक जानकारीपूर्ण है। धन्यवाद –

+2

नोड v6: > [1,2,3] .forEach (console.log.bind (console)) 1 0 [1, 2, 3] 2 1 [1, 2, 3) में काम नहीं करता है ] 3 2 [1, 2, 3] –

+0

अभी भी नोड v7 में विफल रहा है। यदि आप सरणी के तत्वों को लॉग इन करना चाहते हैं तो मैं इस समाधान से बचूंगा। यह उत्तर कॉलबैक के तीन पैरामीटर पर 'console.log' लागू होता है और बहुत गन्दा और अवांछनीय आउटपुट प्रिंट करता है। यद्यपि उत्तर लिखा गया था, लेकिन संभवत: क्योंकि विशेष जावास्क्रिप्ट कार्यान्वयन गलत था, IMHO। कॉलबैक इन दिनों तीन पैरामीटर लेता है। –

21

यह उनका कहना है वहाँ console.log के कार्यान्वयन में व्यवहार में एक फर्क है कि लायक है। नोड v0.10.19 के तहत आपको कोई त्रुटि नहीं मिलती है; आप बस इस देखें:

> [1,2,3,4,5].forEach(console.log); 
1 0 [ 1, 2, 3, 4, 5 ] 
2 1 [ 1, 2, 3, 4, 5 ] 
3 2 [ 1, 2, 3, 4, 5 ] 
4 3 [ 1, 2, 3, 4, 5 ] 
5 4 [ 1, 2, 3, 4, 5 ] 

इसका कारण यह है forEach को कॉलबैक एक तीन पैरामीटर समारोह मूल्य सूचकांक और सरणी ही ले जा रहा है। फ़ंक्शन console.log उन तीन पैरामीटर को देखता है और कर्तव्यपूर्वक उन्हें लॉग करता है।

क्रोम ब्राउज़र कंसोल के तहत, हालांकि, आप मिल

> [1,2,3,4,5].forEach(console.log); 
TypeError: Illegal invocation 

और इस मामले में, bindहोगा काम:

> [1,2,3,4,5].forEach(console.log.bind(console)); 
1 0 [ 1, 2, 3, 4, 5 ] 
2 1 [ 1, 2, 3, 4, 5 ] 
3 2 [ 1, 2, 3, 4, 5 ] 
4 3 [ 1, 2, 3, 4, 5 ] 
5 4 [ 1, 2, 3, 4, 5 ] 

लेकिन वहाँ एक वैकल्पिक तरीका है: ध्यान दें कि forEach पर दूसरा पैरामीटर कॉलबैक में उपयोग करने के लिए this का मान लेता है:

> [1,2,3,4,5].forEach(console.log, console) 
1 0 [ 1, 2, 3, 4, 5 ] 
2 1 [ 1, 2, 3, 4, 5 ] 
3 2 [ 1, 2, 3, 4, 5 ] 
4 3 [ 1, 2, 3, 4, 5 ] 
5 4 [ 1, 2, 3, 4, 5 ] 

जो क्रोम कंसोल और मेरे लिए नोड में काम करता है। बेशक, मुझे यकीन है कि आप क्या चाहते हैं सिर्फ मूल्यों है हूँ, इसलिए मुझे डर है कि सबसे अच्छा समाधान है, वास्तव में कर रहा हूँ:

> [1,2,3,4,5].forEach(function (e) {console.log(e)}); 
1 
2 
3 
4 
5 

चाहे नोड के व्यवहार एक बग है, या यह बस का लाभ लेता है तथ्य यह है कि console.log ईसीएमए द्वारा निर्दिष्ट नहीं है अपने अधिकार में दिलचस्प है।लेकिन अलग-अलग व्यवहार, और तथ्य यह है कि आपको यह पता होना चाहिए कि आपकी कॉलबैक this का उपयोग करती है या नहीं, इसका मतलब है कि हमें सीधे कोडिंग पर वापस जाना होगा, भले ही यह function कीवर्ड के लिए वर्बोज़ धन्यवाद हो।

+0

में काम नहीं करता है इस स्पष्टीकरण के लिए धन्यवाद - पाठकों को निम्नलिखित लिंक मिल सकता है जो Array.prototype.forEach() के अपेक्षित तर्कों का वर्णन करता है, और आपूर्ति किए गए कॉलबैक (जैसे आपने चर्चा की) के पास दिए गए तर्क: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – arcseldon

+1

हालांकि तीर फ़ंक्शंस के साथ आप इसका उपयोग कर सकते हैं: '[1,2,3] .forEach (v => console.log (v)) '। ;-) – RobG

+0

दरअसल, मुझे विश्वास नहीं है कि मैं अभी भी 2014 के आरंभ में 'forEach' (और दोस्तों) के तर्क के रूप में लंबी-फ़ॉर्म फ़ंक्शन अभिव्यक्ति का उपयोग कर रहा था। हालांकि, इसके तुरंत बाद स्विच किया जाना चाहिए। –

संबंधित मुद्दे

 संबंधित मुद्दे