.bind()
विधि this
के मान के रूप में पहले तर्क के रूप में पारित किए गए किसी भी कार्य के साथ एक फ़ंक्शन वापस कर देगा।
जब से तुम .test()
से .bind()
कॉल कर रहे हैं, तो आप new RegExp(key, 'g')
करने के लिए बाध्य this
साथ .test()
विधि हो रही है।
/./
यहां अप्रासंगिक है। यह RegExp.prototype.test
विधि प्राप्त करने का एक छोटा सा तरीका है।
नतीजा यह है कि आप को प्रभावी ढंग से करने जा रहे हैं है:
var regexp = new RegExp(key, 'g');
filterArray.filter(function(val) {
return regexp.test(val);
});
आप ध्यान देना चाहिए कि यह एक छोटा सा खतरनाक है, क्योंकि g
संशोधक के साथ एक regex वस्तु स्टेटफुल है। इसका मतलब है कि यह हमेशा एक नई खोज शुरू करता है जहां पिछला एक छोड़ा गया था।
इस फ़िल्टरिंग परिदृश्य को देखते हुए, g
बिल्कुल आवश्यक नहीं लगता है, और वास्तव में केवल समस्याएं पैदा कर सकता है।
यहाँ यहाँ g
का उपयोग कर के खतरे का एक उदाहरण है:
var re = /./.test.bind(new RegExp("foo", 'g'));
var str = "foobar";
console.log(re(str)); // true
console.log(re(str)); // false
तो एक ही स्ट्रिंग पर एक ही regex बुला पैदा करता है दो अलग-अलग परिणाम है। अगर हम इसे फिर से बुलाते हैं, तो यह एक बार फिर true
होगा।
तो एक .filter()
कॉलबैक के रूप में उपयोग को देखते हुए, मान लें कि key
"foo"
है करते हैं, तो कहते हैं कि एक val
"foobar"
है की सुविधा देता है। फिल्टर के माध्यम से इसकी अनुमति होगी।
लेकिन मान लें कि अगले val
"foobaz"
है। खोज पहले से शुरू करने के बजाय चौथे चरित्र पर फिर से शुरू होगी, इसलिए "foo"
नहीं मिलेगा।
यहाँ ठोस उदाहरण है कि कार्रवाई में इस मुद्दे को पता चलता है:
डेमो:http://jsfiddle.net/s9PzL/
var filterArray = [
"foobar",
"foobaz",
"foobuz",
"foobix"
];
var result = filterArray.filter(/./.test.bind(new RegExp("foo", 'g')));
सभी श्रृंखलाएं "foo"
है, ताकि उन सभी के माध्यम से मिलना चाहिए। लेकिन परिणाम दिखाता है कि ऐसा नहीं होता है।
document.body.textContent = result.join(", "); // foobar, foobuz
आप हमें चर 'key' तो देना यदि हाँ। –
@DavidStarkey कृपया मेरा संपादन देखें। – ptf
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind –