2012-10-26 11 views
17

क्या कोई अन्यथा उत्कृष्ट jQuery.each फ़ंक्शन को अब (0) मूल Array.forEach से अलग डिज़ाइन किया गया है? एफएक्स:jQuery.each कार्यान्वयन देशी Array से अलग है। प्रत्येक

var arr = ['abc','def']; 
arr.forEach(function(entry, index) { 
    console.log(entry); // abc/def 
}); 

यह पूर्ण समझ में आता है।

$.each(arr, function(index, entry) { 
    console.log(entry); 
}); 

किसी को भी इस डिजाइन निर्णय के पीछे तर्क पता है: लेकिन jQuery index पहले तर्क के रूप में डाल करने के लिए चुना है? मैंने हमेशा $.each बड़े पैमाने पर उपयोग किया है, लेकिन यह हमेशा मुझे खराब करता है कि सूचकांक पहला तर्क था क्योंकि इसका शायद ही कभी उपयोग किया जाता है। मैं जानता हूँ कि jQuery this के माध्यम से एक सीधा संदर्भ लागू किया लेकिन यह बहुत भ्रामक है यदि आप कार्य करें:

​var arr = ['abc','def']; 
$.each(arr, function() { 
    console.log(this === 'abc'); // false both times, since this is a String constructor 
});​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

ऐसा नहीं है कि यह मुझे इतना परेशान है, मैं सबसे आम नई सरणी कार्यों के लिए देशी polyfills उपयोग करना पसंद करते हैं, लेकिन मैं हमेशा से है डिजाइन निर्णय के बारे में उत्सुक था। हो सकता है कि ब्राउज़रों ने देशी forEach को लागू करने से पहले पुराने समय में बनाया गया था और विरासत समर्थन ने उन्हें बदलने से रोक दिया था, या ...?

या शायद, यह इस तरह से डिज़ाइन किया गया है क्योंकि देशी वस्तुओं पर भी इसका उपयोग किया जा सकता है, इसके बजाय कॉलबैक में मूल्य से पहले कुंजी को "समझ में आता है" ...?

Sidenote: मैं Underscore.js (और शायद अन्य पुस्तकालयों) यह दूसरी तरह के आसपास (देशी कार्य करने के लिए और अधिक समान) करता है पता है।

+3

jQuery का गैर-अनुरूप संस्करण मूल विधियों की तरह ऐरे में छेद पर छोड़ने में विफल रहता है। –

+1

एक साइड नोट के रूप में, अंडरस्कोर सिर्फ "मूल कार्य के समान नहीं है"; यह वास्तव में मूल कार्य का उपयोग करता है यदि वर्तमान में (और यदि नहीं, तो यह इसके कार्यान्वयन का उपयोग करता है जिसे विशेष रूप से मूल दर्पण के लिए डिज़ाइन किया गया है)। – machineghost

+0

मुझे पता है कि इससे कोई फर्क नहीं पड़ता, लेकिन मुझे नहीं लगता कि मैं 'ऑर्डर, इंडेक्स)' के आदेश में भी सहमत हूं। मुझे नहीं पता कि यह '(कुंजी, मान)' क्यों नहीं होगा, क्योंकि 'कुंजी' सरणी के लिए 'इंडेक्स' जैसा ही है और आप आमतौर पर चीजों को 'कुंजी, मान' के रूप में संदर्भित करते हैं। बस मेरा दृष्टिकोण ... – Ian

उत्तर

14

ठीक है, मुझे लगता है कि हम श्री Resig खुद इस पर एक स्पष्टीकरण के लिए पूछना होगा। तथ्य यह है कि एकमा स्क्रिप्ट 262 संस्करण 5 बहुत बड़े पैमाने पर समय jQuery बनाया गया है और विकसित किया गया था नहीं था, है, इसलिए यह निश्चित खेलने में आता है। और चूंकि इसे इस प्रकार डिज़ाइन किया गया था, इसलिए वे इसे बाद में बदलना नहीं चाहते थे और सभी मौजूदा कोड तोड़ना नहीं चाहते थे।

असल में, ऐरे लूप करते समय इसकी अनुक्रमणिका की तुलना में अधिक प्राथमिकता वाले तत्व को एक्सेस करना चाहते हैं। तो, मेरे लिए कोई उचित स्पष्टीकरण क्यों तुम कॉलबैक में पहले सूचकांक में पास होता है।

आश्वस्त रहें, अगर jQuery आज आविष्कार किया गया था, वे देशी कार्यान्वयन व्यवहार का अनुसरण करेगी।

दूसरी ओर, अगर यह कीड़े आप बहुत ज्यादा आप बस एक शॉर्टकट बना और देशी Array.prototype.forEach का उपयोग अपने jQuery पुनरावृत्ति करने के लिए कर सकते हैं लिपटे सेट:

var forEach = Function.prototype.call.bind(Array.prototype.forEach); 

forEach($('div'), function(node) { 
    console.log(node); 
}); 

मानक सरणी के लिए ..और, बस अपने मूल प्रोटोटाइप के साथ जाओ।

5

यह वास्तव में पिछले jQuery conf में उल्लेख किया गया; दुर्भाग्यवश मुझे विवरण याद नहीं है, लेकिन यदि आप इससे पर्याप्त वीडियो देखते हैं तो मुझे लगता है कि आप इसे पा सकते हैं (I सोचें कि यह मुख्य नोट के बाद क्यू & ए के दौरान था, लेकिन मुझे उस पर उद्धरण न दें)। किसी भी तरह से (मुझे नहीं लगता कि यह खुद को रेजिग था, लेकिन एक और वरिष्ठ jQuery संगठन सदस्य) मूल रूप से कहा "jQuery में कुछ चीजें हैं जिन्हें हम सभी जानते हैं समस्याग्रस्त हैं (" प्रत्येक "उनके द्वारा दिए गए उदाहरणों में से एक है) लेकिन लाखों हैं वहां मौजूद साइटें जो अब उस समस्याग्रस्त व्यवहार पर भरोसा करती हैं ताकि हम इसे अभी नहीं बदल सकें।"

तो संक्षेप में, जवाब है कि वे एक बुरा निर्णय लिया (Resig एक अविश्वसनीय प्रोग्रामर है, लेकिन फिर भी वह सही नहीं है) और अब हर कोई का उपयोग कर jQuery क्योंकि पुस्तकालय का कहना है समय के आराम के लिए पीड़ित है नए संस्करणों में अपेक्षाकृत उच्च पिछड़ा संगतता (और चलिए इसका सामना करते हैं, यह एक अच्छी बात है: जब भी आप jQuery को अपग्रेड करते हैं तो आप अपनी पूरी साइट को फिर से लिखना नहीं चाहते हैं)

यह भी उल्लेखनीय है कि अंडरस्कोर लाइब्रेरी में each विधि है जो उसी हस्ताक्षर के साथ अंतर्निहित each है। असल में, बेहतर प्रदर्शन के लिए अंडरस्कोर का संस्करण वास्तव में अंतर्निहित संस्करण का उपयोग करता है, केवल इसका पालन करता है संस्करण यदि ब्राउज़र अंतर्निहित each का समर्थन नहीं करता है। चूंकि jQuery ऑब्जेक्ट्स केवल सरणी हैं, इसलिए आप आसानी से _.each के साथ उनका उपयोग कर सकते हैं, और चूंकि अंडरस्कोर में jQuery से बहुत अधिक कार्यक्षमता गायब है, यह jQuery के पूरक के लिए एक उत्कृष्ट लाइब्रेरी है।

+0

पीएस यदि आप चाहें तो इस समस्या को "ठीक करने" के लिए आप हमेशा jQuery की प्लग-इन प्रणाली का उपयोग कर सकते हैं। – machineghost

+0

पी.पी.एस. सम्मेलन में उन्होंने यह भी बताया कि भविष्य का संस्करण (2.1 आईआईआरसी) पिछड़ा-संगतता तोड़ने जा रहा है, इसलिए मैंने जो कहा वह 100% सच नहीं है। हालांकि, यह पुरानी आईईएस का समर्थन नहीं करने के मामले में केवल पीछे की संगतता को तोड़ने जा रहा है; प्रत्येक की तरह सामान तय करने के लिए नहीं जा रहा है। – machineghost

1

अच्छी तरह से मैं सहमत हूं कि key सेकेंड रखने के लिए यह अधिक समझ में आता है लेकिन आपको $.each को किसी ऑब्जेक्ट या सरणी के साथ उपयोग किया जा सकता है और ऑब्जेक्ट के मामले में आप चाबियाँ चाहते हैं क्योंकि उनका अर्थ है।

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