এই প্রসঙ্গটি আমি কোনও ফাংশনে কীভাবে পাস করব?


213

আমি ভেবেছিলাম এটি এমন কিছু যা আমি সহজেই গুগল করতে পারি তবে সম্ভবত আমি সঠিক প্রশ্ন করছি না ...

প্রদত্ত জাভাস্ক্রিপ্ট ফাংশনটিতে "এটি" যা উল্লেখ করা আছে তা কীভাবে সেট করব?

উদাহরণস্বরূপ, jQuery এর বেশিরভাগ ফাংশন যেমন:

$(selector).each(function() {
   //$(this) gives me access to whatever selector we're on
});

আমি কীভাবে আমার নিজের স্ট্যান্ডেলোন ফাংশনগুলিকে কল / কল করতে পারি যখন যখন ডাকা হয় তখন উপযুক্ত "এই" রেফারেন্স থাকে? আমি jQuery ব্যবহার করি, সুতরাং যদি এটি করার কোনও jQuery- নির্দিষ্ট উপায় থাকে তবে তা আদর্শ হতে পারে।


সম্ভাব্য অনুরূপ: stackoverflow.com/questions/520019/...
user123444555621

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে অন্যদের এখানে অবতরণ করার জন্য jQuery দেখুন$.proxy
রাইবোল্ট

উত্তর:


302

জাভাস্ক্রিপ্ট .call()এবং .apply()পদ্ধতিগুলি আপনাকে কোনও ক্রিয়াকলাপের জন্য প্রসঙ্গ সেট করার অনুমতি দেয় ।

var myfunc = function(){
    alert(this.name);
};

var obj_a = {
    name:  "FOO"
};

var obj_b = {
    name:  "BAR!!"
};

এখন আপনি কল করতে পারেন:

myfunc.call(obj_a);

কোনটি সতর্ক হবে FOO। অন্য উপায়, পাস যখন obj_bসতর্কতা ছিল BAR!!.call()এবং এর মধ্যে পার্থক্যটি .apply()হ'ল .call()একটি কমা বিচ্ছিন্ন তালিকাটি গ্রহণ করে যদি আপনি নিজের ফাংশনে যুক্তি দিয়ে যাচ্ছেন এবং .apply()একটি অ্যারের প্রয়োজন হয়।

myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);

অতএব, আপনি পদ্ধতিটি hookব্যবহার করে সহজেই একটি ফাংশন লিখতে পারেন apply()। উদাহরণস্বরূপ, আমরা jQuerys .css()পদ্ধতিতে একটি বৈশিষ্ট্য যুক্ত করতে চাই । আমরা আসল ফাংশন রেফারেন্স সংরক্ষণ করতে পারি, কাস্টম কোড দিয়ে ফাংশনটি ওভাররাইট করে স্টোর করা ফাংশনটি কল করতে পারি।

var _css = $.fn.css;
$.fn.css = function(){
   alert('hooked!');
   _css.apply(this, arguments);
};

যেহেতু ম্যাজিক argumentsঅবজেক্টটি বস্তুর মতো একটি অ্যারে, তাই আমরা কেবল এটিতে পাস করতে পারি apply()। এইভাবে আমরা গ্যারান্টি দিচ্ছি যে সমস্ত পরামিতিগুলি মূল ফাংশনে চলে গেছে।


4
কেবল একটি মজাদার টিডিবিট: যদি আপনাকে বার বার ফাংশনটি কল করার প্রয়োজন হয় obj_a, উদাহরণস্বরূপ, আপনি এটির একটি অনুলিপি তৈরি করতে পারেন var boud_myfunc = myfunc.bind(obj_a)এবং কেবল bound_myfunc()প্রয়োজন হিসাবে কল করতে পারেন।
wbadart

44

ব্যবহারfunction.call :

var f = function () { console.log(this); }
f.call(that, arg1, arg2, etc);

ফাংশনে thatআপনি যে অবজেক্টটি চান তা কোথায় this


1
functionএকটি সংরক্ষিত কীওয়ার্ড; function.call(...)বৈধ জাভাস্ক্রিপ্ট না হওয়ায় একটি নামকৃত ফাংশন অন্তর্ভুক্ত করতে আপনার প্রতিক্রিয়া আপডেট করার বিষয়ে বিবেচনা করুন ।
ড্যানিয়েল অ্যালেন

1
@ ড্যানিয়েল অ্যালেন: আমি যে নমুনা ফাংশন নাম সরবরাহ করব তার সংজ্ঞা ছাড়াই কোডটি এখনও জেএস ত্রুটি ছুঁড়ে ফেলবে। তবে, আমি নমুনা ফাংশন নাম আপডেট করেছি।
পালসুইম

16

jQuery একটি ব্যবহার করে .call(...)thisপ্যারামিটার হিসাবে আপনি যে ফাংশনটি পাস করেন তার অভ্যন্তরে বর্তমান নোডটি নির্ধারণ করার জন্য পদ্ধতি করে।

সম্পাদনা করুন:

আপনার যদি সন্দেহ হয় তখন jQuery এর কোডের ভিতরে দেখতে ভয় পাবেন না, এটি সমস্ত পরিষ্কার এবং ভাল ডকুমেন্টেড জাভাস্ক্রিপ্টে রয়েছে।

যেমন: এই প্রশ্নের উত্তর 574 লাইনের কাছাকাছি,
callback.call( object[ name ], name, object[ name ] ) === false


12

আপনি কোনও ফাংশনের মধ্যে প্রসঙ্গ সেট করতে বাইন্ড ফাংশনটি ব্যবহার করতে পারেন this

function myFunc() {
  console.log(this.str)
}
const myContext = {str: "my context"}
const boundFunc = myFunc.bind(myContext);
boundFunc(); // "my context"

12

আর একটি মৌলিক উদাহরণ:

কাজ করছে না:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
};
img.src = reader.result;

ওয়ার্কিং:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
}.bind(this);
img.src = reader.result;

সুতরাং মূলত: কেবল আপনার ফাংশনে .bind (এটি) যুক্ত করুন


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অনেক সহজ বাক্য গঠন, মনের উপর অনেক সহজ ... ভাল কাজ জোয়ারী
নেনিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.