2016-08-30 2 views
6

मैं वर्तमान में जावास्क्रिप्ट कोर्स का अनुसरण कर रहा हूं और उदाहरणों में से एक में जावास्क्रिप्ट में दृश्यों के पीछे क्या हो रहा है, इसे समझने में समस्याएं हैं (नीचे कोड देखें)।जावास्क्रिप्ट उदाहरण को समझने में कठिनाई

मैं अधिकांश कोड को समझता हूं और समझता हूं कि आउटपुट लॉग इन क्यों है -> [झूठी, सत्य, सत्य]। लेकिन वहाँ एक हिस्सा जो मुझे पागल गाड़ी चला रहा है (मैं तल पर कोड में कोई ऐरो बताया):

मेरी भ्रम पैरामीटर 1 के आसपास घूमती है:

क्या यात्रा करता है पैरामीटर 1 ले इस पल से var arr5 = mapForEach(arr1, checkPastLimitSimplified(1)); में पारित हो जाता है।

मैं समझता हूं कि checkPastLimitSimplified(1) को इस फ़ंक्शन के लिए निष्पादन संदर्भ बनाया गया है जिसमें पैरामीटर 1 परिवर्तनीय वातावरण में है।

लेकिन अब क्या होता है? checkPastLimitSimplified फ़ंक्शन के अंदर फ़ंक्शन अभी तक निष्पादित नहीं किया गया है लेकिन अभी वापस लौटाया गया है। यह वापस आने पर कैसा दिखता है? limiter चर किस बिंदु पर 1 पैरामीटर प्राप्त करते हैं?

मुझे लगता है कि .bind(this, limiter); फ़ंक्शन की एक प्रति बनाता है। क्या यह limiter पहले से ही 1 लौटने से पहले परिवर्तनीय है?

function mapForEach(arr, fn) { 

    var newArr = []; 
    for (var i = 0; i < arr.length; i++) { 
    newArr.push(
     fn(arr[i]) 
    ) 
    }; 

    return newArr; 
} 

var arr1 = [1, 2, 3]; 

var checkPastLimitSimplified = function(limiter) { // < ----CONFUSED 
    return function(limiter, item) { 
    return item > limiter; 
    }.bind(this, limiter); 
}; 

var arr5 = mapForEach(arr1, checkPastLimitSimplified(1)); 
console.log(arr5); 

उत्तर

4

चलें संबंधों को देखने के लिए चर नाम बदलने:

var checkPastLimitSimplified = function(outer_limiter) { 
    return function(limiter, item) { 
    return item > limiter; 
    }.bind(this, outer_limiter); 
}; 

bind को संशोधित करता समारोह हस्ताक्षर सिर्फ function(item) वापसी से पहले किया जाना है।
जब ग्राहक कोड checkPastLimitSimplified(1)(item) पर कॉल करेगा, तो लिमिटर बाध्य संदर्भ से प्रतिस्थापित होगा।

+0

इसलिए यदि मैं इसे सही ढंग से समझता हूं, तो 'outer_limiter' पैरामीटर को' चेकपास्टलिमिट सिम्प्लिफाइड (1) 'पर कॉल करके फ़ंक्शन में पारित किया जाता है, फ़ंक्शन वापस आने से पहले लाभ प्राप्त होता है। इसलिए अनिवार्य रूप से 'फ़ंक्शन (1, आइटम) { वापसी आइटम> limiter; } 'वापस आ गया है? तो 'वापसी' इस बिंदु पर निष्पादित करने से रोक नहीं है। – Yapartase

+0

निश्चित रूप से, 'वापसी' पूरे 'फ़ंक्शन() {}। बाइंड()' अभिव्यक्ति से संबंधित है। –

0

एक और तरीका है इसे और अधिक समझ में आता भीतरी समारोह के बाहर डाल रहा है बनाने के लिए:

var checkPastLimit = function(limiter, item) { 
    return item > limiter; 
}; 

var checkPastLimitSimplified = function(outer_limiter) { 
    return checkPastLimit.bind(this, outer_limiter); 
}; 

परिणाम पहले पैरामीटर (सीमक) पहले से ही परिभाषित के साथ पहली बार समारोह की एक प्रति हो जाएगा।

इस नए फ़ंक्शन को केवल दूसरे पैरा (आइटम) की आवश्यकता होगी।

लेकिन इस चरण पर फ़ंक्शन कोड (सीमा के साथ तुलना) का कोई निष्पादन नहीं है।

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