2015-09-25 13 views
5

मैं है मेरी HTML फ़ाइल में निम्न कोड:फ़ंक्शन क्यों कहा जाता है? जावास्क्रिप्ट/खिड़की

<script type="text/javascript"> 
     window.never = function() { 
       console.log('this function is never called'); 
     } 
     (function(d, s, id){ 
      var js, srjs = d.getElementsByTagName(s)[0]; 
      if (d.getElementById(id)) {return;} 
      js = d.createElement(s); js.id = id; 
      js.src = "this.script.does.not.exist.js"; 
      srjs.parentNode.insertBefore(js, srjs); 
     }(document, 'script', 'streamrail-jssdk')); 
    </script> 

देखें बेला: http://jsfiddle.net/sebvaeja/

कंसोल को देखते हुए, आप देख सकते हैं कि window.never समारोह वास्तव में कहा जाता है ('इस समारोह कभी नहीं है जिसे 'कंसोल पर लिखा जाता है) कहा जाता है।

क्रोम देव उपकरण के साथ इसे डिबग करते समय, मैं कॉल स्टैक में देखता हूं कि कॉलर बंद था (पहली पंक्ति: http://jsfiddle.net/sebvaeja/)।

अगर मैं बदल वैश्विक क्षेत्र बंद होने के लिए कार्य करते हैं कभी नहीं:

function never() { 
      console.log('this function is never called'); 
    } 

तो यह नहीं कहा जा रहा है।

क्या कोई बता सकता है कि खिड़की क्यों है। किसी भी समारोह को क्यों बुलाया जा रहा है? कॉल ट्रिगर कर रहा है क्या? मुझे लगता है कि यह विंडो ऑब्जेक्ट पर होने वाले फ़ंक्शन के साथ कुछ करने के लिए है, लेकिन मुझे इसके पीछे तर्क नहीं दिख रहा है।

+0

बस शब्दों में कहें, आपके पास वाक्यविन्यास त्रुटि है। :) – isherwood

+0

यह भी एक डुप्लिकेट है लेकिन मुझे यह नहीं मिल रहा है। –

+1

'var log = function() {console।लॉग ('इस समारोह को बुलाया जाता है'); } (42) ' –

उत्तर

13

समारोह अभिव्यक्ति कोष्ठक द्वारा पीछा किया जाता है:

function() { ... }(...) 
:

window.never = function() { ... } 
(...) 

समारोह अभिव्यक्ति के बाद लाइन ब्रेक नहीं, चर बयान को समाप्त करता है पार्सर एक समारोह कॉल है कि के लिए तो

वास्तव में, आप यहां एक ही तकनीक का उपयोग कर रहे हैं:

(function(d, s, id){ 
    // ... 
}(document, 'script', 'streamrail-jssdk')) 

यह एक फ़ंक्शन अभिव्यक्ति है जिसके बाद (...) है और यह फ़ंक्शन को कॉल करता है।

समाधान: परिभाषा के बाद अर्धविराम जोड़ें और आप अच्छे हैं।


अगर मैं बदल वैश्विक क्षेत्र बंद होने के लिए कार्य करते हैं कभी नहीं ... तो यह नहीं कहा जा रहा है।

उस मामले में समारोह परिभाषा के रूप में समारोह घोषणा, नहीं अभिव्यक्ति व्याख्या की है। एक फ़ंक्शन घोषणा एक कथन की तरह अधिक है और इसलिए CallExpression का हिस्सा नहीं हो सकता है। इसलिए निम्नलिखित कोष्ठक समूहबद्ध ऑपरेटर के रूप में व्याख्या किया जाता है (जैसा कि आप इरादा रखते हैं)।

5

प्लेस के बाद सेमी-कोलन समारोह घोषणा:

window.never = function() { 
      console.log('this function is never called'); 
    }; 

यह सीधे बाद में चलाता है कि समारोह कॉल (...) के कारण है।

window.never = function() { 
      console.log('this function is never called'); 
    } 
    (...) // <-- Triggers call of `window.never` 
संबंधित मुद्दे