उद्धरण और कोष्ठक के साथ और बिना setTimeout के बीच अंतर


240

मैं जावास्क्रिप्ट सीख रहा हूं और मैंने हाल ही में जावास्क्रिप्ट समय घटनाओं के बारे में सीखा है। जब मुझे W3Schools के बारे setTimeoutमें पता चला , तो मैंने एक अजीब आकृति देखी, जिसे मैंने पहले नहीं चलाया था। वे दोहरे उद्धरण चिह्नों का उपयोग कर रहे हैं और फिर फ़ंक्शन को कॉल करते हैं।

उदाहरण:

setTimeout("alertMsg()", 3000);

मुझे पता है कि जावास्क्रिप्ट में डबल और सिंगल कोट्स का अर्थ स्ट्रिंग है।

इसके अलावा मैंने देखा कि मैं भी ऐसा ही कर सकता हूं:

setTimeout(alertMsg, 3000);

जिस कोष्ठक के साथ यह संदर्भित हो रहा है, बिना कोष्ठक के इसकी प्रतिलिपि बनाई गई है। जब मैं उद्धरण और कोष्ठक का उपयोग कर रहा हूं तो यह पागल हो रहा है।

मुझे खुशी होगी अगर कोई मुझे उपयोग करने के इन तीन तरीकों के बीच का अंतर समझा सके setTimeout:

कोष्ठक के साथ:

setTimeout("alertMsg()", 3000);

उद्धरण और कोष्ठक के बिना:

setTimeout(alertMsg, 3000);

और तीसरा केवल उद्धरण का उपयोग कर रहा है:

setTimeout("alertMsg", 3000);

एनबी: setTimeoutसंदर्भ के लिए एक बेहतर स्रोत एमडीएन होगा ।


5
@Jefffrey कि w3fools वेबसाइट यह नहीं कहती है कि सामग्री गलत है, बस यह पुराना हो सकता है और कुछ नए सामान गायब हो सकते हैं। कोर सामान के लिए (या सीखने के लिए) संदर्भ के रूप में उपयोग करने के लिए ठीक होना चाहिए। मैं समझ सकता हूं कि लोग जिस तरह से वे जैसे वे w3 का हिस्सा हैं, वैसे ही दिखने की कोशिश करने से निराश हो रहे हैं, लेकिन यह सामग्री से अलग नहीं होता है। यह अच्छी तरह से बाहर रखा गया है और स्पष्ट उदाहरणों के साथ पढ़ने में आसान है, नोक के लिए प्रीफेक्ट।
मैथ्यू

14
@ मैथ्यू "हमें लगता है, हालांकि, W3Schools गलत जानकारी के साथ समुदाय को नुकसान पहुंचा रहे हैं।" - पहले तीन लाइनों के भीतर।
जूता

1
@ जेफ्री हाँ, मैंने देखा कि लेकिन नीचे जहां उन्होंने समझाया कि वे इसके बारे में क्या पसंद नहीं करते हैं, "W3Schools मुसीबत है" अनुभाग में, उन तीन कारणों में से कोई भी जो उनके पास गलत जानकारी के साथ कुछ भी करने के लिए नहीं है। उनके पास ऐसी किसी भी चीज़ का एक भी उदाहरण नहीं है जो वास्तव में "गलत" है। उनकी शिकायतें हैं कि वे स्पष्ट रूप से यह नहीं कहते हैं कि वे w3 से संबद्ध नहीं हैं, वे बिना मान्यता प्राप्त प्रमाणपत्र के लिए शुल्क लेते हैं, और वे नई सामग्री (जैसे html 5) के साथ जल्दी से अपडेट नहीं करते हैं।
मैथ्यू

10
@ मैथ्यू, आउटडेटेड informations, जावास्क्रिप्ट, एसक्यूएल या पीएचपी जैसी नाजुक भाषाओं में, पुराने और संभावित खतरनाक प्रौद्योगिकियों (जैसे mysql_PHP के विस्तार) से चिपके रहने के आकांक्षी प्रोग्रामर का जनता का मार्गदर्शन है , जिनमें से एसओ प्रश्न धारा सिर्फ एक उदाहरण है। IIRC SQL सेक्शन में कुछ बहुत ही सूक्ष्म गलतियाँ थीं, लेकिन यह लगभग एक साल हो गया है क्योंकि पिछली बार जब मैंने वेबसाइट का दौरा किया था और उनमें से बहुत कुछ ठीक हो सकता है। और ऊपर भी सब सही था, तो मैं अभी भी एक वेबसाइट को बढ़ावा नहीं दूंगा जो लोगों को उनके प्रमाण पत्र की धोखाधड़ी के साथ धोखा देने की कोशिश करता है।
जूता

4
एक तरफ छायादार प्रमाणपत्र, यह एक सभ्य संदर्भ संसाधन है और यह एसओ के पूरे बिंदु के लिए उल्टा है जो उन्हें बदनाम करता है।
worc

जवाबों:


382

का उपयोग कर setIntervalयाsetTimeout

आपको किसी फ़ंक्शन के लिए पहले तर्क के रूप में संदर्भ पास करना चाहिए setTimeoutया setInterval। यह संदर्भ इस रूप में हो सकता है:

  • एक अनाम फ़ंक्शन

    setTimeout(function(){/* Look mah! No name! */},2000);
  • किसी मौजूदा फ़ंक्शन का एक नाम

    function foo(){...}
    
    setTimeout(foo, 2000);
  • एक चर जो किसी मौजूदा फ़ंक्शन को इंगित करता है

    var foo = function(){...};
    
    setTimeout(foo, 2000);

    ध्यान दें कि मैंने "फ़ंक्शन नाम" से अलग "फ़ंक्शन में चर" सेट किया है। यह स्पष्ट नहीं है कि चर और फ़ंक्शन नाम एक ही नामस्थान पर कब्जा कर लेते हैं और एक-दूसरे पर चढ़ सकते हैं।

तर्क पास करना

एक फ़ंक्शन को कॉल करने और मापदंडों को पारित करने के लिए, आप टाइमर को सौंपे गए कॉलबैक के अंदर फ़ंक्शन को कॉल कर सकते हैं:

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);

हैंडलर में तर्कों को पारित करने के लिए एक और तरीका है, हालांकि यह क्रॉस-ब्राउज़र संगत नहीं है

setTimeout(foo, 2000, arg1, arg2, ...argN);

कॉलबैक संदर्भ

डिफ़ॉल्ट रूप से, कॉलबैक का संदर्भ ( thisटाइमर द्वारा कॉल किए गए फ़ंक्शन के अंदर का मूल्य ) निष्पादित होने पर वैश्विक ऑब्जेक्ट है window। क्या आप इसे बदलना चाहते हैं, उपयोग करें bind

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);

सुरक्षा

यद्यपि यह संभव है, आपको स्ट्रिंग को पासsetTimeout या पास नहीं करना चाहिए setInterval। स्ट्रिंग को पास करना setTimeout()या इसके setInterval()समान कार्यक्षमता का उपयोग करना eval()जो स्क्रिप्ट के रूप में स्ट्रिंग्स को निष्पादित करता है , जिससे मनमाना और संभवतः हानिकारक स्क्रिप्ट निष्पादन संभव हो जाता है।


मैंने सीखा है कि जब आप केवल फ़ंक्शन नाम का उपयोग कर रहे हैं, तो फ़ंक्शन की प्रतिलिपि बनाई गई है, तो आप अपने पहले उदाहरण में क्यों कह रहे हैं कि सेटटाउट फ़ू (फ़ंक्शन) पास संदर्भ फ़ंक्शन मैंने झुक लिया है की प्रतिलिपि बनाई गई है। और क्या आप मुझे और अधिक लंबा कर सकते हैं कृपया eval के बारे में कृपया।
user1316123

41
@ user1316123 फ़ंक्शन कभी भी कॉपी नहीं किए जाते हैं। वस्तुओं और सरणियों के साथ भी। वे संदर्भ द्वारा पारित कर रहे हैं । आपको w3schools पढ़ना बंद कर देना चाहिए। वे अच्छे से अधिक नुकसान कर रहे हैं
यूसुफ

4
@JosephtheDreamer कार्यों हैं वस्तुओं। "एक फ़ंक्शन नाम" और "एक चर जो एक फ़ंक्शन को संदर्भित करता है" एक ही बात है। इसके अलावा, आप सीधे सेट-आउट करने के लिए मापदंडों को पारित कर सकते हैं (इसके लिए एक लैम्ब्डा में लपेटने की आवश्यकता नहीं है (हालांकि जैसे आपने कहा था - नए ब्राउज़र)। इसके अलावा, समस्या उपयोगकर्ताओं को स्क्रिप्ट निष्पादित करने की अनुमति देने के साथ नहीं है (वे हमेशा ऐसा कर सकते हैं)। यह अन्य उपयोगकर्ताओं से इनपुट स्वीकार करके और स्क्रिप्ट के रूप में चल रहा है । उपयोगकर्ता स्वयं हमेशा कंसोल खोल सकता है और जावास्क्रिप्ट को निष्पादित कर सकता है।
बेंजामिन ग्रुएनबाम

@BenjaminGruenbaum मैं आपके दूसरे वाक्य पर लगभग समान टिप्पणी करने वाला था। हंसी :)
ErikE

2
मुझे ठीक से काम करने के लिए सेटटाइमआउट के लिए एक फ़ंक्शन का उपयोग करने की आवश्यकता नहीं थी। इसे साफ करने के लिए धन्यवाद।
मैट डेल

3

मुझे लगता है कि आपके द्वारा लिखा गया सेटटाइमआउट फ़ंक्शन चलाया नहीं जा रहा है। यदि आप jquery का उपयोग करते हैं, तो आप ऐसा करके इसे सही ढंग से चला सकते हैं:

    function alertMsg() {
      //your func
    }

    $(document).ready(function() {
       setTimeout(alertMsg,3000); 
       // the function you called by setTimeout must not be a string.
    });

मुझे लगता है कि आप की तरह है, लेकिन लिंक w3schools.com/js/js_timing.asp किसी और बात कहते हुए
user1316123

अगर मैं सही ढंग से समझता हूं कि जब मैं ब्रैकेट्स का उपयोग कर रहा हूं, तो मैं केवल उस फ़ंक्शन का उल्लेख कर सकता हूं जिसमें सेटटाइमआउट विधि शामिल है फ़ंक्शन को केवल स्थानीय दायरे में कोष्ठक पर उपलब्ध है?
user1316123

2

जोसेफ के साथ पूरी तरह से सहमत हैं।

यहाँ यह परीक्षण करने के लिए एक बेला है: http://jsfiddle.net/nicocube/63s2s/

फिडेल के संदर्भ में, स्ट्रिंग तर्क काम नहीं करता है, मेरी राय में क्योंकि फ़ंक्शन वैश्विक दायरे में परिभाषित नहीं है।


w3schools.com/js/js_timing.asp यदि आप कृपया लिंक दर्ज कर सकते हैं और देख सकते हैं, तो जोसेफ इसके खतरनाक कहते हैं, लेकिन यदि आप इसकी कड़ी में प्रवेश करते हैं
user1316123

लोग इसे देखें: quirksmode.org/js/this.html इस लिंक में
लिखा है

हाँ, यह हो सकता है, क्योंकि फ़ंक्शन JS में ऑब्जेक्ट हैं। निष्कासन के साथ समस्या यह है कि यह वैश्विक संदर्भ में विकसित होगा, और स्थानीय संदर्भ प्राप्त करने में विफल रहेगा जो एक बेला के साथ होता है।
निकोक्यूब

क्या आप eval कृपया के बारे में कुछ शब्दों में समझा सकते हैं।
user1316123

कुछ अच्छे स्पष्टीकरण: javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval
निकोच

1

वास्तविकता में क्या होता है जब आप फ़ंक्शन के पहले पैरामीटर के रूप में स्ट्रिंग पास करते हैं

setTimeout ( 'string', number)

पहला मान का मूल्यांकन किया गया है जब यह चलाने का समय है ( numberमील के सेकंड के बाद पारित)। मूल रूप से यह बराबर है

setTimeout ( eval('string'), number)

ये है

एक वैकल्पिक वाक्यविन्यास जो आपको फ़ंक्शन के बजाय एक स्ट्रिंग को शामिल करने की अनुमति देता है, जिसे टाइमर समाप्त होने पर संकलित और निष्पादित किया जाता है। यह सिंटैक्स उन्हीं कारणों के लिए अनुशंसित नहीं है जो eval () सुरक्षा जोखिम का उपयोग करते हैं।

इसलिए जो नमूने आप देखें, वे अच्छे नमूने नहीं हैं, और अलग-अलग संदर्भों में या साधारण टाइपो में दिए जा सकते हैं।

यदि आप इस तरह से आह्वान करते हैं setTimeout(something, number), तो पहला पैरामीटर स्ट्रिंग नहीं है, लेकिन कुछ कहा जाता है something। और फिर से अगर somethingस्ट्रिंग है - तो इसका मूल्यांकन किया जाएगा। लेकिन अगर यह फ़ंक्शन है, तो फ़ंक्शन निष्पादित किया जाएगा। jsbin नमूना


0
    ##If i want to wait for some response from server or any action we use setTimeOut.

    functionOne =function(){
    console.info("First");

    setTimeout(()=>{
    console.info("After timeOut 1");
    },5000);
    console.info("only setTimeOut() inside code waiting..");
    }

    functionTwo =function(){
    console.info("second");
    }
    functionOne();
    functionTwo();

## So here console.info("After timeOut 1"); will be executed after time elapsed.
Output:
******************************************************************************* 
First
only setTimeOut() inside code waiting..
second
undefined
After timeOut 1  // executed after time elapsed.

-1

कोष्ठक के साथ:

setTimeout("alertMsg()", 3000); // It work, here it treat as a function

उद्धरण और कोष्ठक के बिना:

setTimeout(alertMsg, 3000); // It also work, here it treat as a function

और तीसरा केवल उद्धरण का उपयोग कर रहा है:

setTimeout("alertMsg", 3000); // It not work, here it treat as a string

function alertMsg1() {
        alert("message 1");
    }
    function alertMsg2() {
        alert("message 2");
    }
    function alertMsg3() {
        alert("message 3");
    }
    function alertMsg4() {
        alert("message 4");
    }

    // this work after 2 second
    setTimeout(alertMsg1, 2000);

    // This work immediately
    setTimeout(alertMsg2(), 4000);

    // this fail
    setTimeout('alertMsg3', 6000);

    // this work after 8second
    setTimeout('alertMsg4()', 8000);

ऊपर दिए गए उदाहरण में पहले alertMsg2 () फ़ंक्शन कॉल तुरंत (हम 4S को समय देते हैं लेकिन यह परेशान नहीं करते हैं) उसके बाद अलर्टमेस्स 1 () (2 सेकंड का एक समय इंतजार) फिर alertMsg4 () (8 सेकंड का एक समय इंतजार) लेकिन अलर्टएमजी 3 () काम नहीं कर रहा है क्योंकि हम इसे पार्टियों के बिना उद्धरण के भीतर रखते हैं इसलिए इसे एक स्ट्रिंग के रूप में माना जाता है।


उस परिदृश्य को दर्शाता है, जिसके बारे में प्रश्नकर्ता पूछता है, लेकिन वास्तव में प्रश्न का उत्तर नहीं देता है। मैं यह नहीं देखता कि यह मौजूदा 6 साल पुराने उत्तरों में क्या जोड़ता है।
स्टीफन पी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.