2011-02-01 14 views
10

कहो कि मैं निम्नलिखित कोड है:Javascript क्रियान्वयन आदेश()

function testA { 
    setTimeout('testB()', 1000); 
    doLong(); 
} 

function testB { 
    doSomething(); 
} 

function doLong() { 
    //takes a few seconds to do something 
} 

मैं निष्पादित testA()। मैंने पढ़ा है कि जावास्क्रिप्ट एकल-थ्रेडेड है। 1000 मिलीसेकंड के बाद क्या होता है, जब testB() के लिए टाइमआउट पहुंच जाता है?

कुछ संभावनाओं मैं के बारे में सोच सकते हैं:

  • testB()doLong() के बाद निष्पादित करने के लिए ऊपर कतार में है और कुछ और यह कहा जाता है समाप्त कर दिया है।
  • doLong() तुरंत समाप्त हो जाता है और testB() शुरू कर दिया है।
  • doLong() एक छोटे से दिया जाता है लंबे समय तक बंद कर दिया जा रहा है (या तो स्वतः या उपयोगकर्ता को संकेत के बाद) और testB() शुरू कर दिया है इससे पहले कि निष्पादित करने के लिए है।
  • doLong() रुका हुआ है, testB() शुरू कर दिया है। testB() समाप्त होने के बाद, doLong() फिर से शुरू हो गया। सही जवाब

क्या है? यह कार्यान्वयन निर्भर या मानक का हिस्सा है? *

This question, समान है, लेकिन समान नहीं है जहाँ तक मैं बता सकता है।

भी लिंक आप बेहतर समझ Javascript क्रियान्वयन के लिए सिफारिश कर सकते हैं की सराहना की जाएगी।

धन्यवाद!

* हाँ, मुझे पता है कि नहीं सभी ब्राउज़रों मानकों :(

उत्तर

10

अपने अनुमान के पहले सही एक है का पालन करें: testB() is queued up to execute after doLong() and anything else it called have finished.

यदि यह एक सेकंड से अधिक लेता है testA समाप्त करने के लिए के लिए, testB बस आप setTimeout('testB()', 1000) बजाय setTimeout(testB, 1000) लिखना चाहिए प्रतीक्षा करनी होगी।

इसके अलावा,। setTimeout के लिए एक स्ट्रिंग भेजा जा रहा है eval, generally considered evil का उपयोग कर की तरह, है और आप कर देगा दुश्मन;)

+0

मुझे विश्वास था कि 'setTimeout (function() {testB(); }, 1000); 'सबसे अच्छा तरीका है, क्या मैं गुमराह था? –

+2

@ छाया विज़ार्ड: हाँ, बहुत ज्यादा गुमराह। जहां तक ​​मुझे पता है कि आपके रास्ते और खान के बीच कोई अंतर नहीं है (सिवाय इसके कि मेरा कोर्स कम है: डी)। उदाहरण के लिए, कल्पना करें कि क्या हमने आपकी अभिव्यक्ति को एक चर में खींच लिया है: 'var f = function() {testB(); }; सेटटाइमआउट (एफ, 1000); '। अभी भी वही अर्थ है, लेकिन अब आप अनावश्यकता देख सकते हैं। – Jakob

+1

उत्तर के लिए और एक स्ट्रिंग के बजाय setTimeout पर फ़ंक्शन पास करने के बारे में सलाह के लिए धन्यवाद। ऐसा लगता है कि मैं पढ़ रहे ट्यूटोरियल थोड़ा संदिग्ध हैं;) –