यदि मैं कोष्ठक के साथ किसी फ़ंक्शन को कॉल करता हूं, तो जावास्क्रिप्ट में, क्या इससे कोई फर्क पड़ता है?


105

खाली कोष्ठक के साथ या किसी भी कोष्ठक के बिना किसी फ़ंक्शन को कॉल करते समय मैंने एक अंतर देखा। हालाँकि, मैं फ़ंक्शन के लिए कोई तर्क नहीं दे रहा हूं, इसलिए मुझे आश्चर्य है कि, क्या अंतर होगा:

window.onload = initAll();

तथा

window.onload = initAll;

कृपया इसके पीछे के सिद्धांत की व्याख्या करें।


24
@ जेएस बैंग्स - केवल यूएस अंग्रेजी में; अन्यत्र नहीं। हालांकि प्रोग्रामर भ्रम की स्थिति से बचने के लिए उन्हें "कोष्ठक" कहते हैं, लेकिन यूके की अंग्रेजी में राउंडेड को बस कोष्ठक के रूप में जाना जाता है। वर्ग वाले "वर्ग कोष्ठक" के रूप में जाने जाते हैं। en.wikipedia.org/wiki/ ब्रैकेट
रोब लेविन

13
एक गंभीर नोट पर, आधिकारिक UNICODE का नाम पेरेंटेसिस है। 0028 ( LEFT PARENTHESIS = शुरुआती कोष्ठक (1.0) और 0029 ) सही PARENTHESIS = समापन कोष्ठक (1.0) - unicode.org/charts/charindex.html#P और इसके बारे में Dictionary.com का क्या कहना है - dictionary.reference.com/ ब्राउज़ करें / PARENTHESIS "या तो दोनों या ऊपर की ओर घुमावदार रेखाएं, () ..."

8
तो यह सिर्फ एक "अमेरिकी अंग्रेजी" बात नहीं है, यह एक अंतर्राष्ट्रीय मानक परिभाषा है क्योंकि UNICODE एक अंतर्राष्ट्रीय मानक है।

2
@ फजी - आप अपने तथ्यों को गंभीरता से कहां से प्राप्त करते हैं? {}गिलहरी कोष्ठक कहा जाता है।
अनुराग

7
@ फजी लॉलीपॉप - यूनिकोड एक अंतरराष्ट्रीय मानक है जो बाइट के रूप में एन्कोडिंग वर्णों पर है, नामकरण पर नहीं। यूनिकोड दस्तावेज़ के लेखक एक चरित्र के लिए दिए गए नाम का दावा नहीं कर रहे हैं एक अंतरराष्ट्रीय मानक है। यह कोड बनाम चरित्र वे परिभाषित कर रहे हैं। लेकिन, आप यह नोट करना पसंद कर सकते हैं कि वे [और] वर्ग कोष्ठक के रूप में भी संदर्भित करते हैं - (न कि केवल "कोष्ठक"), और यह कि वे सभी का उल्लेख करते हैं [, {और कोष्ठक के रूप में। आपको बारीकियों को समझने का प्रयास करना चाहिए। जिस तरह से अलग-अलग जगह एक ही शब्द का उपयोग किया जाता है। यदि आप एक अंतरराष्ट्रीय टीम का हिस्सा हैं, तो बहुत महत्वपूर्ण है।
रोब लेविन

जवाबों:


161
window.onload = initAll();

यह सीधे निष्पादित करता initAll() है और फ़ंक्शन के रिटर्न मान को असाइन करता है window.onload। यह आमतौर पर वह नहीं है जो आप चाहते हैं। initAll()समझ बनाने के लिए इसके लिए एक फ़ंक्शन वापस करना होगा।

window.onload = initAll;

यह वास्तविक कार्य प्रदान करता है window.onload- यह संभव है क्योंकि जावास्क्रिप्ट में, @ फेलिक्स के अनुसार, फ़ंक्शन प्रथम श्रेणी की वस्तुएं हैं - इसे निष्पादित किए बिना। initAllलोड घटना द्वारा निष्पादित किया जाएगा।


18
यहां उल्लेख करना महत्वपूर्ण है कि फ़ंक्शन जावास्क्रिप्ट में प्रथम श्रेणी की वस्तुएं हैं।
फेलिक्स क्लिंग

136

पेकका जो कहते हैं वह सही है, लेकिन मैं एक उदाहरण के साथ थोड़ा विस्तार करना चाहता हूं जो किसी को समझाने में मदद करेगा जो फ़ंक्शन पॉइंटर्स या प्रतिनिधियों को पूरी तरह से नहीं समझता है।

मैं उपयोग नहीं करूंगा window.onloadक्योंकि यह प्रदर्शित करने के लिए थोड़ा सा विरोध है। मैं इसके बजाय प्रदर्शन करने के लिए एक सरल गुणा फ़ंक्शन का उपयोग करूंगा:

function Multiply(operator, operand) {
    return operator * operand;
}

यह समान रूप से लिखा जा सकता है:

Multiply = function(operator, operand) {
    return operator * operand;
}

हालांकि पहले उदाहरण में, निहितार्थ स्पष्ट नहीं हो सकता है, दूसरा उदाहरण अधिक स्पष्ट रूप से दिखाता है कि हम एक फ़ंक्शन को असाइन कर रहे हैं जिसमें 2 पैरामीटर हैं जिन्हें चर कहा जाता है Multiply, और असाइनमेंट के रूप में फ़ंक्शन की यह अवधारणा पूरे जावास्क्रिप्ट में आम है। यह इस तथ्य का एक छोटा प्रदर्शन है कि फ़ंक्शंस "प्रथम श्रेणी के नागरिक" हैं , अर्थात् , उन्हें लगभग उसी तरह से पारित किया जा सकता है जैसे कि हम मूल्यों के आसपास से गुजर रहे थे।

तो अब असाइनमेंट के अंतर पर:

var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);

रिट चर को परिभाषित करने के बिंदु पर, Multiplyनिष्पादित किया जाता है और रिटर्न मान असाइन किया retजाता है - 12 के बराबर हो जाता है।

आइए कोशिश करते हैं कि फिर से एक अलग तरीका:

var operator = 3;
var operand = 4;
var ret = Multiply;

अब, परिभाषित करने के बिंदु पर ret, retआपके Multiplyफ़ंक्शन से प्राप्त परिणाम के विपरीत आपका फ़ंक्शन बन जाता है Multiply। कॉल ret()आपके Multiplyफ़ंक्शन को निष्पादित करने का कारण बनेंगे, और आप इसे ठीक उसी तरह से कॉल कर सकते हैं जैसे कि आप कॉल करते हैं Multiply(operator, operand):

var out = ret(3, 4);

के समान है

var out = Multiply(3, 4);

आपने प्रभावी रूप से कहा है कि आप retएक प्रतिनिधि के रूप में उपयोग करने जा रहे हैं Multiply()। फोन करते समय ret, हम वास्तव में Multiplyफ़ंक्शन का उल्लेख कर रहे हैं ।

वापस अपने लिए window.onload। इसे इस प्रकार समझें:

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

initAll = function() {
    return 12;
}

तो जैसा कि आप देख सकते हैं, window.onloadकिसी अन्य फ़ंक्शन की तरह ही एक फ़ंक्शन है, इसके बारे में कुछ खास नहीं है। आप इसे एक मूल्य प्रदान कर सकते हैं, इसे एक फ़ंक्शन निर्दिष्ट कर सकते हैं, यदि आप चाहें तो इसे बाहर निकाल दें - मुद्दा यह है कि window.onloadआपके स्वयं के फ़ंक्शन के बारे में इससे अधिक विशेष कुछ भी नहीं है। केवल थोड़ी अलग बात यह है कि इसे लोड होने पर खिड़की से बुलाया जाता है। [डिस्क्लेमर: मैंने वास्तव में कभी खिड़की के काम नहीं किए हैं, इसलिए मुझे यकीन नहीं है कि इससे नकारात्मक नतीजे मिलेंगे। एक उम्मीद है कि वे यह देखने के लिए जाँच करेंगे कि क्या किसी फ़ंक्शन को कॉल करने से पहले असाइन किया गया है if (window.onload) window.onload();]।

अब initAll()हम जो कह रहे हैं वह है:

window.onload = initAll();

जो भी कह सकता है:

window.onload = 12;

लेकिन जब हम कहते हैं कि initAllकोष्ठकों के बिना, क्या हम वास्तव में कह रहे है: मैं बदलने के लिए जो कुछ भी मेरे window.onload समारोह एक नया कार्य के साथ, है चाहता हूँ - यानी मैं अपने साथ इसे बदलना चाहते initAllसमारोह है, ताकि कोई भी कॉल window.onloadरन मेरी initAllकोड।

इसलिए:

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

इसके साथ प्रतिस्थापित किया गया है:

window.onload = function() {
    return 12;
}

तो कोई भी कॉल मूल रूप से जो भी था उसके बजाय window.onloadआपके initAllफ़ंक्शन को निष्पादित करेगा window.onload। आपने मूल फ़ंक्शन को अपने नए फ़ंक्शन से बदल दिया है।

वास्तव में, आप हो सकता है उतना ही लिखें:

window.onload = function() {
    //Write all your init code right in here instead of having a separate 
    //initAll function.
}

एक और उदाहरण जो बेहतर प्रदर्शित कर सकता है वह यह है:

var d = new Date();
var currentTime = d.getTime();

समय जो भी था dपरिभाषित किया गया है समाप्त होता है को सौंपा गया है currentTime। महान, लेकिन यह केवल तभी उपयोगी है जब हम यह जानना चाहते हैं कि उस कोड वाले फ़ंक्शन को किस समय कहा गया था - अर्थात पृष्ठ लोड समय पर। क्या होगा यदि हम वर्तमान समय को किसी भी समय currentTimeचाहते हैं जिसे कहा जाता है?

var currentTime = function() {
    var d = new Date();
    return d.getTime();
}

var a = currentTime(); //The current time at the point a is defined...
var b = currentTime;   //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined

ध्यान दें कि हम b()अपने कार्यों cऔर dअसाइनमेंट में कैसे कॉल करते हैं जैसे हम कॉल कर सकते हैं currentTime()?


अद्भुत जवाब!
Shadi Almosri

अरे, क्या होगा अगर मैं एक समारोह में जोड़ना चाहता हूं जो एक घटना श्रोता पर बहस करता है?
शेमिरोह

16

जावास्क्रिप्ट में कार्य प्रथम श्रेणी के नागरिक हैं, और इस तरह, अन्य चर को सौंपा जा सकता है या तर्क के रूप में पारित किया जा सकता है।

तो, जब आप करते हैं

window.onload = initAll;

आप फ़ंक्शन को संदर्भित करने onloadके लिए windowऑब्जेक्ट की संपत्ति सेट कर रहे हैं initAll

जब तुम करोगे

window.onload = initAll();

आप initAll onloadका रिटर्न मान रखने के लिए प्रॉपर्टी सेट कर रहे हैं , क्योंकि यह उस लाइन पर लागू होगा।


10

initAll एक फ़ंक्शन मान का संदर्भ है और कोष्ठक ऑपरेटर फ़ंक्शन नाम में जोड़ा गया है जो इस फ़ंक्शन ऑब्जेक्ट को रन करता है।

तो अगर आप कुछ ऐसा करते हैं

a = initAll

तब aजैसा initAllआप कर सकते हैं वैसा ही बन जाएगा a()- लेकिन साथ

a = initAll()

चर aनिष्पादित initAllफ़ंक्शन का रिटर्न मान प्राप्त करेगा


8

मुझे 6 साल की देर हो गई है लेकिन मुझे लगता है कि उपरोक्त उत्तरों की तुलना में इसे बहुत सरल समझा जा सकता था।

तो यहाँ TLDR है ; या विहंगम दृश्य का उपयोग करते समय कार्यों बुला और का उपयोग नहीं कर ()रहा है

इस फ़ंक्शन को उदाहरण के लिए लेते हैं:

function foo(){
return 123;
}

यदि आप "फू" लॉग करते हैं - बिना ()

console.log(foo); 

---outout------
function foo(){
return 123;
}

फ़ंक्शन का उपयोग ()करने के लिए कोई साधन नहीं है । यदि आप चाहते हैं कि आप इसे कॉलबैक के रूप में पारित कर दें तो आप ऐसा करेंगे।


यदि आप "foo ()" - के साथ लॉग इन करते हैं ()

console.log(foo());
-----output-----
 123

()किसी फ़ंक्शन के बाद उपयोग करने का अर्थ है फ़ंक्शन को निष्पादित करना और उसका मूल्य वापस करना

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