2015-12-06 4 views
5

कौन सी तंत्र कॉलिंग फ़ंक्शन के नाम से अपने कॉलर से arguments को संदर्भित करने के लिए जावास्क्रिप्ट फ़ंक्शन को अनुमति देता है और यह अभी भी भाषा में क्यों है?जावास्क्रिप्ट में कॉलर में तर्कों का संदर्भ देने के लिए क्यों संभव है?

मैं पूंछ कॉल अनुकूलन (बल्कि उसके अभाव या) वी 8 में देख रहा था और इस पोस्ट में आए (https://code.google.com/p/v8/issues/detail?id=457)

एरिक Corry के उदाहरण पहले तो नीचे

function foo(x) { 
    return bar(x + 1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

foo(1) 

दिया जाता है मुझे लगा एक फ़ंक्शन का आह्वान करने से arguments फ़ील्ड किसी प्रकार के अजीब वैश्विक दुष्प्रभाव के रूप में सेट होता है, लेकिन यह केवल कॉल की अवधि के लिए रहता है।

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

console.log(foo(1)); // prints '1' 
console.log(foo.arguments); // prints 'null' 

भाषा में यह व्यवहार क्यों है? क्या यह पीछे की संगतता के अलावा कुछ भी उपयोगी है?

संपादित करें:

मैं arguments का उपयोग कर मौजूदा समारोह शरीर में बहस के छद्म सरणी का उल्लेख करने के बारे में पूछ नहीं कर रहा हूँ, उदा

function variadic() { 
    for (var i = 0; i < arguments.length; i++) { 
     console.log("%s-th item is %s", i, JSON.stringify(arguments[i])); 
    } 
} 

variadic(1, 2, 3, 4, 5, []); 

मैं somefunction.arguments का उपयोग कर एक फोन करने वाले की arguments का उल्लेख करने के बारे में पूछ रहा हूँ।

+0

जावास्क्रिप्ट में किसी फ़ंक्शन को किसी भी तर्क के साथ बुलाया जा सकता है, इससे कोई फर्क नहीं पड़ता कि उनमें से कितने सूचीबद्ध हैं। जावास्क्रिप्ट फ़ंक्शंस में एक अंतर्निहित ऑब्जेक्ट होता है जिसे तर्क वस्तु कहा जाता है जो इस क्षमता का समर्थन करता है। – Gary

+0

मेरी गलती, मेरे उदाहरण में एक टाइपो था। यह 'foo.arguments' कहा जाना चाहिए था। –

+1

ध्यान दें कि यह व्यवहार सख्त मोड में चला गया है, और फ़ंक्शन के 'को पढ़ने का प्रयास कर रहा है।तर्क 'एक त्रुटि फेंक देगा https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode ("सुरक्षित" के तहत) – Eevee

उत्तर

1

यह उपयोगी हो सकता है यदि आप त्रुटियों को पकड़ना चाहते हैं और उन्हें अपने कोड के अंदर गणना करना चाहते हैं, तो आप एक एकीकृत आउटपुट पर उपयोगकर्ता को समाप्त करने के लिए चीजों को स्पष्ट कर सकते हैं (या सिर्फ डीबग), या उन त्रुटियों को सर्वर पर भेज सकते हैं ताकि आप वहां जान सकें आपके कोड पर एक समस्या है। यह सब caller और arguments सामान स्टैक डीबग करने में मदद कर सकता है। यह कॉलर फ़ंक्शन (और संभवतः इसके तर्क) के नाम को प्रिंट करने, लॉगिंग (फिर से, डिबगिंग सामान) पर भी मदद कर सकता है। या आप एक गूढ़ प्रोग्राम कर सकते हैं जो इस जानकारी का किसी भी तरह उपयोगी रूप से उपयोग करता है (शायद ऑब्जेक्ट फ़ंक्शन के अंदर)।

कारण क्यों यह मौजूद है कि इस भाषा (मुझे लगता है कि क्यों एक अच्छा सवाल यहाँ नहीं है) का हिस्सा है।

-1

आप बुलाया कार्य करने के लिए arguments चर पारित कर सकते हैं:

function foo(x) { 
    return bar(x+1, arguments); 
} 

function bar(x, foo_arguments) { 
    return foo(foo_arguments[0]); 
} 

या एक वैश्विक चर पर कि चर डाल:

var args = false; 

function foo(x) { 
    args = arguments; 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(args[0]); 
} 

संपादित करें:

या की caller संपत्ति का उपयोग समारोह:

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(bar.caller.arguments[0]); 
} 

लेकिन यह सब मेरे लिए बहुत अधिक समझ में नहीं आता है। क्या आप स्पष्ट कर सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं?

+2

अगर कोई डाउनवोट्स, कम से कम एक टिप्पणी क्यों दे सकता है। – emi

+0

मैंने डाउनवॉटेड किया क्योंकि ऐसा लगता है कि 'foo.arguments' कैसे उपयोगी है और यह क्यों मौजूद है के वास्तविक प्रश्न के साथ कुछ भी नहीं करना प्रतीत होता है – Eevee

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

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