পরামিতি হিসাবে পরামিতি সহ একটি ফাংশন পাস?


151

পরামিতি হিসাবে পরামিতিগুলির সাথে জাভাস্ক্রিপ্ট ফাংশনটি পাস করা কি সম্ভব?

উদাহরণ:

$(edit_link).click( changeViewMode( myvar ) );

5
এটি JQuery এর মতো লাগে এবং সম্ভবত এটি হয় তবে এটি অপ্রাসঙ্গিক। জাভাস্ক্রিপ্ট লাইব্রেরি আপনি যা ব্যবহার করেন তা নির্বিশেষে ব্যবহার বা পরামিতি এবং ফাংশনগুলি একই।
গুফা 14

@ গুফা - আমি ভাবছিলাম যে এটি jQuery এর সাথে ট্যাগ করা উচিত
রাশ ক্যাম

1
@Lucia এ গৃহীত উত্তর পরিবর্তন বিবেচনা করুন এই
মিশা পেরেকোভস্কি

আপনি প্রতিক্রিয়া সঙ্গে কাজ করেন, তাহলে বিবেচনা stackoverflow.com/questions/41369497/...
মাইকেল Freidgeim

উত্তর:


244

একটি "বন্ধ" ব্যবহার করুন:

$(edit_link).click(function(){ return changeViewMode(myvar); });

এটি একটি বেনামে অস্থায়ী ফাংশন মোড়ক তৈরি করে যা প্যারামিটার সম্পর্কে জানে এবং এটিকে আসল কলব্যাক বাস্তবায়নে দেয়।


3
আপনি যদি কোনও বস্তুতে কোনও ফাংশন কল করতে চান তবে আপনাকে বাইন্ড () কল করতে হবে। myObj.click (ফাংশন () {this.doSomething (); ind .বাইন্ড (myObj)); এটি "এটি "কে আমার ওবিজে পরিণত করবে।
এলি

1
এগুলির সাথে অনেকগুলি কাজ করার সময় এটি কোনও পারফরম্যান্স সমস্যা নয়? যেমন আপনি একটি সারিটিতে একটি অনপ্রেস সরবরাহ করছেন এবং আপনার 10,000 টি সারি রয়েছে 10,000 এটি প্রতিটি সারিটির জন্য একটি নতুন বেনামে অস্থায়ী ফাংশন মোড়ক তৈরি করে। এটা করতে অন্য কোন উপায় আছে কি?
জোশুয়া পিন্টার

@ জোশুয়াপিন্টার এই কৌশলটি নিজেই কোনও সমস্যা নয়। যদি আপনার একই ফাংশনটির 10,000 বার কল করা হয় তবে আপনি কেবল একটি চলকতে মোড়কটি সংরক্ষণ করতে পারেন, আপনি কেবল এটি একবার তৈরি করতে পারেন। আপনার যদি 10,000 টি ভিন্ন প্রসঙ্গ পাস করার দরকার হয় তবে আপনি খুব কম করতে পারেন। অকাল অপটিমাইজেশন থেকে সাবধান থাকুন: পারফরম্যান্সের সাথে সর্বদা, আপনার সমস্যা আছে কিনা তা দেখার জন্য আপনাকে পরিমাপ করতে হবে। আজকের জাভাস্ক্রিপ্ট ইঞ্জিনগুলি খুব শক্তিশালী এবং আশ্চর্যজনক উপায়ে কোডটি অনুকূলিত করতে পারে।
ফার্ডিনান্দ বায়ার

@ ফারডিনান্দবায়ার দুর্দান্ত, টিপটির জন্য ধন্যবাদ। একটি বন্ধু আমাকে বলেছিল এটি খারাপ অভ্যাস এবং আপনার পরিবর্তে this.myFunction = this.myFunction.bind(this)আপনার constructorপদ্ধতিতে ব্যবহার করা উচিত । তবে, যেমনটি আপনি বলেছেন, যখন আপনি প্রত্যেকটির জন্য এটির জন্য বিভিন্ন প্রসঙ্গটি পাস করতে হয়, সেই সারিটির বিশদ পৃষ্ঠাটি খোলার জন্য আপনি যে সমস্ত পৃথক সারি ক্লিক করেন সেটির মতো, এটি এড়ানো যায় না।
জোশুয়া পিন্টার

@ ফারডিনান্দবায়ার, বলুন যে মাইভার একটি স্ট্রিং এবং এটি পরিবর্তন হিসাবে ভিউমোডকে একটি ক্লোজার হিসাবে পাস করার ক্রমাগত দুটি অনুরোধের মধ্যে পরিবর্তিত হয়েছে, তবে চেঞ্জভিউমোড সর্বদা মাইভারের প্রথম মান পায়, আমি একই মাইভার ভেরিয়েবলকে নির্ধারিত বিভিন্ন যুক্তিযুক্ত মান সহ ক্লোজার ফাংশনটি বলতে চাই
nmxprime

42

ব্যবহার Function.prototype.bind()। এমডিএন উদ্ধৃত:

bind()পদ্ধতি একটি নতুন ফাংশন যা, যখন বলা হয়, তার রয়েছে সৃষ্টি thisশব্দ সেট প্রদান করা মান, পূর্ববর্তী যখন নতুন ফাংশন বলা হয় কোন প্রদত্ত যুক্তিগুলির একটি প্রদত্ত ক্রম সঙ্গে।

এটি IE9 + সহ সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত।

আপনার কোডটি দেখতে এমন হওয়া উচিত:

$(edit_link).click(changeViewMode.bind(null, myvar));

পার্শ্ব দ্রষ্টব্য: আমি ধরে নিই যে আপনি বিশ্বব্যাপী প্রেক্ষাপটে, অর্থাত thisপরিবর্তনশীল window; অন্যথায় thisপরিবর্তে ব্যবহার করুন null


ধন্যবাদ, এটি আমাকে সাহায্য করেছে। এটি এর মতো ব্যবহার করেছেন:$.ajax(url).done(handler.bind(this, var1, var2));
টমাস

2
কোন বিকল্পটি সেরা? বন্ধ ব্যবহার করে বা বাঁধাইয়ের কাজটি ব্যবহার করে? কোনও কার্যকারিতা প্রভাব আছে কিনা তা দয়া করে আমাকে জানান
বরুণ


15

না, তবে আপনি কোনও পরামিতি ছাড়াই পাস করতে পারেন এবং এটি করুন:

$(edit_link).click(
  function() { changeViewMode(myvar); }
);

সুতরাং আপনি কোনও প্যারামিটার ছাড়াই একটি বেনামে ফাংশনটি পাস করছেন, সেই ফাংশনটি পরে আপনার প্যারামিটারাইজড ফাংশনটিকে ক্লোজারের সাথে পরিবর্তনশীল হিসাবে ডাকে



7

অথবা আপনি যদি এস 6 ব্যবহার করছেন তবে আপনার তীর ফাংশনটি ব্যবহার করতে সক্ষম হওয়া উচিত

$(edit_link).click(() => changeViewMode(myvar));

2

তুমি এটি করতে পারো

var message  = 'Hello World';

var callback = function(){
alert(this)
}.bind(message);

এবং তারপর

function activate(callback){
  callback && callback();
}

activate(callback);

অথবা যদি আপনার কলব্যাকে আরও নমনীয় যুক্তি থাকে তবে আপনি বস্তুটি পাস করতে পারেন।

ডেমো


2

এটি ফার্দিনান্দ বেয়ারের পদ্ধতির অনুসরণের একটি উদাহরণ:

function function1()
{
    function2(function () { function3("parameter value"); });
}
function function2(functionToBindOnClick)
{
    $(".myButton").click(functionToBindOnClick);
}
function function3(message) { alert(message); }

এই উদাহরণে "পরামিতি মান" একটি ফাংশন মোড়ানো ব্যবহার করে ফাংশন 2 এর মাধ্যমে ফাংশন 1 থেকে ফাংশন 3 এ স্থানান্তরিত হয়।

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