Bind, Call, और जावास्क्रिप्ट में लागू करें

अनुवादक से:
कृपया ध्यान दें कि यहां दिया गया कोड अच्छा व्यवहार नहीं हो सकता है। फिर भी, इस पोस्ट से स्निपेट को पार्स करना कार्यात्मक जावास्क्रिप्ट में डुबकी लगाने का एक और कारण हो सकता है।

मैंने हाल ही में इस ट्वीट में एक सुरुचिपूर्ण जेएस स्निपेट देखा।
var bind = Function.prototype.call.bind(Function.prototype.bind); // #fp 

उसे देखकर, मैं अनुमान लगा पा रहा था कि वह क्या कर रहा है। यह xy(z) को y(x, z) । एक बच्चे के रूप में आनन्द लेते हुए, मैंने इसे अपने सहयोगियों को दिखाया। उन्होंने मुझसे पूछा कि यहां क्या चल रहा है। मैंने समझाने के लिए अपना मुँह खोला और ... एक शब्द भी नहीं कह सका। मैं मुड़ा और चला गया।

ज्यादातर मामलों में, अच्छी तरह से लिखे गए कोड को देखकर, आप आसानी से अनुमान लगा सकते हैं कि यह क्या करता है। कार्यात्मक जावास्क्रिप्ट में कुछ अनुभव होने के बाद, "कार्यात्मक जावास्क्रिप्ट" और "जावास्क्रिप्ट एलनॉन्ग" (दोनों महान हैं), मुझे इसे पढ़ने में बहुत कठिनाई नहीं हुई। लेकिन कार्यात्मक प्रोग्रामिंग के अनुभव के बिना किसी को इस कोड की व्याख्या कैसे करें?

मैंने सरल उदाहरणों के साथ कदम दर कदम सुलझाना तय किया कि यहां क्या हो रहा है। परिणाम यह था:

 //   ,       var context = { foo: "bar" }; // ,    «foo»  «this» function returnFoo () { return this.foo; } //       ,  undefined returnFoo(); // => undefined //         var bound = returnFoo.bind(context); //      bound(); // => "bar" // //   Function.prototype.bind. //   returnFoo —  ,    Function.prototype // //        // Call  apply        returnFoo.call(context); // => bar returnFoo.apply(context); // => bar //        context.returnFoo = returnFoo; context.returnFoo(); // => bar // //     // //  Array.prototype    slice. //         //      () [1,2,3].slice(0,1); // => [1] //   slice      var slice = Array.prototype.slice; // slice    . - ,  Array.prototype.slice //      «this»,     slice(0, 1); // => TypeError: can't convert undefined to object slice([1,2,3], 0, 1); // => TypeError: ... //     apply  call,       slice.call([1,2,3], 0, 1); // => [1] // Apply   call,       slice.apply([1,2,3], [0,1]); // => [1] //    .call  .   bind? // !    call   slice. slice = Function.prototype.call.bind(Array.prototype.slice); //  slice       slice([1,2,3], 0, 1); // => [1] // // , ?      -. // //     bind  , //     slice var bind = Function.prototype.call.bind(Function.prototype.bind); //  ,     . //  ?   call,  ,      //      . //      var context = { foo: "bar" }; function returnFoo () { return this.foo; } //     bind var amazing = bind(returnFoo, context); amazing(); // => bar // Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind 

Source: https://habr.com/ru/post/In199456/


All Articles