मुझे EcmaScript-5 Function.prototype.bind कार्यान्वयन के बारे में बहुत दिलचस्प सवाल है। आमतौर पर जब आप बाँध का उपयोग करें, आप इसे इस तरह से कार्य करें:Function.prototype.bind
var myFunction = function() {
alert(this);
}.bind(123);
// will alert 123
myFunction();
ठीक है तो कि अच्छा है, लेकिन क्या होने जब हम ऐसा करते हैं लगता है?
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
मैं समझता हूँ कि यह कैसे Function.prototype.bind कार्यान्वित किया जाता है (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind) के मामले में पूरी तरह से तार्किक व्यवहार है। लेकिन वास्तविक जीवन की स्थिति में यह पूरी तरह से बेकार व्यवहार है ना? सवाल यह है: क्या यह बग या फीचर है? अगर यह एक बग है, तो इसका उल्लेख क्यों नहीं किया गया है? यदि यह एक सुविधा है, तो फिर मूल "बाइंड" कार्यान्वयन के साथ Google क्रोम बिल्कुल वही व्यवहार करता है?
if (!Function.prototype.bind) {
Function.prototype.bind = function() {
var funcObj = this;
var original = funcObj;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
var func = function() {
var thatObj = thisObj;
return original.apply(thatObj, extraArgs.concat(
Array.prototype.slice.call(
arguments, extraArgs.length
)
));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(funcObj, args);
}
return func;
};
}
तो अब इस कोशिश:
बनाने के लिए इसे और अधिक स्पष्ट है, क्या मेरी राय में अधिक समझ बनाने हैं, तो यहां कोड स्निपेट कि Function.prototype.bind लागू करता है अलग ढंग से एक छोटा सा है
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();
मेरी राय में, की जगह "इस" अधिक समझ में आता है ...
तो क्या तुम लोग इसके बारे में क्या सोचते हैं?
यह एक सुविधा है। यदि आप इसे ओवरराइड कर सकते हैं, तो यह वास्तव में "बाध्य" नहीं होगा, है ना? विवरण विनिर्देशन में पाया जा सकता है: http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.4.5 –
निश्चित रूप से लेकिन यदि यह है, तो यह निर्धारित करने का तरीका क्या है कि फ़ंक्शन पहले से ही सीमित है या नहीं कुछ कुछ? या फिर इसे पुनर्निर्मित करने का प्रयास करते समय यह कोई अपवाद क्यों नहीं फेंकता है? बात यह है कि यह डीबग करना बेहद मुश्किल बनाता है, अगर आपको नहीं पता कि फ़ंक्शन बाध्य है या आप इसकी पहली प्रतिलिपि से निपटते हैं। कल मेरे साथ ऐसा हुआ, और मैंने समस्या की जड़ें जानने के लिए लगभग एक दिन व्यतीत किया है ... – Ruslan
वैसे भी, ऐसा लगता है कि कोई भी इस सवाल का जवाब नहीं दे रहा है, इसलिए अगर किसी और के पास होगा एक ही समस्या, मैंने एक वर्कअराउड बनाया है जिसे आप यहां पा सकते हैं: http://www.angrycoding.com/2011/09/to-bind-or-not-to-bind-that-is-in.html – Ruslan