2012-12-13 10 views
5

मैं underscore.js library (jQuery एक ही चीज़ करता है) के लिए कोड देख रहा था और सिर्फ कुछ स्पष्टीकरण चाहता था कि क्यों विंडो ऑब्जेक्ट स्वयं निष्पादन समारोह में पारित हो रहा है।यदि वैरिएबल वैश्विक है तो आपको जावास्क्रिप्ट में स्वयं निष्पादन फ़ंक्शन में तर्कों को पारित करने की आवश्यकता क्यों है?

उदाहरण के लिए:

(function() {   //Line 6 
    var root = this;  //Line 12 
    //Bunch of code 
}).call(this);   //Very Bottom 

this के बाद से वैश्विक, कारण है कि यह समारोह में पारित किया जा रहा है? निम्नलिखित काम भी नहीं करेंगे? इस तरह से क्या करने का इरादा होगा?

(function() { 
    var root = this; 
    //Bunch of code 
}).call(); 
+0

स्पष्ट रूप से यह वही है, क्या आप अंडरस्कोर जेएस कोड पोस्ट कर सकते हैं जहां यह किया जाता है? – jxs

+0

कोई तर्क पारित नहीं हो रहा है - कॉलबैक के अंदर 'this' सेट करने के लिए 'कॉल' का उपयोग किया जा रहा है। फिर भी, मैं यह भी नहीं देखता कि यह आपके द्वारा पोस्ट किए गए कोड से क्यों जरूरी है। – apsillers

+0

फ़ंक्शन लाइन 6 पर शुरू होता है, परिवर्तनीय रूट लाइन 12 पर decalred है और फिर कॉल बहुत नीचे है। पूरी फाइल एक बड़ा काम है। – KingKongFrog

उत्तर

4

मुझे संदेह है कि कारण ECMAScript 5 strict mode है।

गैर सख्त मोड में, इस Iife

(function() { 
    console.log(this); // window or global 
})(); 

, (या global वस्तु यदि आप एक Node.js सर्वर पर हैं) window वस्तु लॉग क्योंकि वैश्विक वस्तु को this के रूप में आपूर्ति की जाती है ऐसे कार्य जो किसी ऑब्जेक्ट की विधि के रूप में नहीं चलते हैं।

कि परिणाम की तुलना करें

"use strict"; 
(function() { 
    console.log(this); // undefined 
})(); 

को सख्त मोड में, एक नंगे लागू समारोह के this अनिर्धारित रहता है। इसलिए, अंडरस्कोर लेखक call का उपयोग अज्ञात फ़ंक्शन में एक स्पष्ट this प्रदान करने के लिए करते हैं ताकि यह सख्त और गैर-सख्त मोड में मानकीकृत हो। बस फ़ंक्शन का आविष्कार करना (जैसा कि मैंने अपने उदाहरणों में किया था) या .call() का उपयोग करते हुए एक असंगतता का कारण बनता है जिसे .call(this) के साथ हल किया जा सकता है।

1

jQuery एक ही बात करता है, और आप उन पंक्तियों के साथ खोज के द्वारा इतने पर आपके सवाल का कई जवाब मिल सकता है। समय

  1. लोड हो रहा है:

    वहाँ जो दोनों के काफी मामूली अनुकूलन के लिए कर रहे हैं स्थानीय दायरे में window की तरह हमेशा-उपलब्ध वैश्विक चर के लिए दो कारणों से, कर रहे हैं। एक स्थानीय चर को देखते हुए वैश्विक वैरिएबल को देखने से थोड़ा कम समय लगता है, क्योंकि दुभाषिया को संदर्भ पेड़ को दूर तक देखना नहीं पड़ता है। फ़ंक्शन की लंबाई से अंडरस्कोर या jQuery का आकार, जो सैद्धांतिक रूप से धीमी मशीनों पर कम-छोटी अवधि तक जोड़ सकता है।

  2. फ़ाइलेंइज़। जावास्क्रिप्ट न्यूनीकरण इस तथ्य पर निर्भर करता है कि वेरिएबल्स को तब तक कुछ भी नामित किया जा सकता है जब तक कि वे सुसंगत हों। myLongVariableName minified संस्करण में a बन जाता है। पकड़, ज़ाहिर है, यह केवल स्क्रिप्ट के अंदर परिभाषित चर पर लागू हो सकता है; जो कुछ भी बाहर खींच रहा है उसे वही नाम काम पर रखना है, क्योंकि यदि आप window को pr तक घटाते हैं तो दुभाषिया यह नहीं जान पाएगा कि आप किस बारे में बात कर रहे हैं। खुद के लिए एक संदर्भ के साथ पीछा करके, कम करें की तरह कर सकते हैं:

    (function(A){ B(A, {...}); A.doStuff(); //etc });})(window) 
    

    और हर बार जब आप अन्यथा window (6 अक्षर) डाल दिया होता तो आप अब A (1 चरित्र) है। फिर, प्रमुख नहीं, लेकिन एक बड़ी फ़ाइल में जो स्कोप प्रबंधन के लिए नियमित आधार पर window को स्पष्ट रूप से कॉल करने की आवश्यकता है, यह महत्वपूर्ण हो सकता है, और यदि आप इसे दो बार उपयोग करते हैं तो आपको कुछ पात्रों से पहले से ही लाभ मिल गया है। और बड़े, लोकप्रिय पुस्तकालय जो सीमित सर्वरों और उन लोगों के लिए सेवा करते हैं जिनके पास लुभावनी इंटरनेट योजनाएं हो सकती हैं, हर बाइट मायने रखती है। प्रश्न पर टिप्पणी को पढ़ने के बाद


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

आप what function.call() actually does को देखें, तो अपने दूसरे टुकड़ा वास्तव में काम नहीं होता - this में पारित किया जा रहा, कोई तर्क नहीं है यह एक स्पष्ट है फ़ंक्शन के लिए संदर्भ कॉलिंग, और आपको इसे .call() पर प्रदान करना होगा। फ़ाइल की शुरुआत में रेखा उपरोक्त दो उद्देश्यों को पूरा करती है। call के साथ संदर्भ को स्पष्ट रूप से सेट करने का कारण भविष्यरोधक है - अभी, अज्ञात कार्यों को वैश्विक संदर्भ मिलता है, लेकिन सैद्धांतिक रूप से जो बदल सकता है, भविष्य में ईसीएमए विनिर्देश में निराश हो सकता है, या एक विशिष्ट ब्राउज़र पर अजीब व्यवहार कर सकता है। इंटरनेट का उपयोग करने वाले आधे के लिए, अधिक स्पष्ट होना और पूरी तरह से इस मुद्दे से बचने के लिए सबसे अच्छा है। this/window शीर्ष स्तर पर पसंद मुझे लगता है कि गैर-पीसी उपकरणों (यानी मोबाइल) के बारे में चिंता करने के साथ कुछ करने के लिए संभावित रूप से उनके शीर्ष-स्तरीय ऑब्जेक्ट के लिए एक अलग नाम का उपयोग करना होगा।

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

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