প্যারামিটার হিসাবে একটি জাভাস্ক্রিপ্ট ফাংশন পাস


665

"প্যারেন্ট" ফাংশনটি কার্যকর না করে বা ব্যবহার না করে আমি কীভাবে পরামিতি হিসাবে কোনও ফাংশনটি পাস করব eval()? (যেহেতু আমি পড়েছি যে এটি অনিরাপদ।

আমি এই আছে:

addContact(entityId, refreshContactList());

এটি কাজ করে, তবে সমস্যাটি হ'ল refreshContactListফাংশনটি যখন ব্যবহৃত হয় তার চেয়ে ফাংশনটি ডাকা হয় তখন ফায়ার হয়।

আমি এটি ব্যবহার করে আশেপাশে যেতে পারি eval(), তবে আমি যা পড়েছি তা অনুসারে এটি সর্বোত্তম অনুশীলন নয়। আমি কীভাবে জাভাস্ক্রিপ্টের প্যারামিটার হিসাবে একটি ফাংশন পাস করতে পারি?

উত্তর:


929

আপনার কেবল বন্ধনী অপসারণ করতে হবে:

addContact(entityId, refreshContactList);

এরপরে এটি প্রথমে কার্যকর না করেই ফাংশনটি পাস করে।

এখানে একটি উদাহরণ:

function addContact(id, refreshCallback) {
    refreshCallback();
    // You can also pass arguments if you need to
    // refreshCallback(id);
}

function refreshContactList() {
    alert('Hello World');
}

addContact(1, refreshContactList);

6
@ স্টিভেফেন্টন, আপনার উত্তরটি h2ooooooo মন্তব্য দিয়ে আপডেট করার বিষয়ে বিবেচনা করুন, এটি খুব দরকারী হবে।
মরগান উইল্ড

5
প্রশ্নের উপর ভিত্তি করে, কলব্যাক প্যারামিটারগুলি গ্রহণ করে না, এ কারণেই আমি তাদের উদাহরণ থেকে বাদ দিয়েছি। আমি এটি সম্পর্কে একটি মন্তব্য যুক্ত করব।
ফেন্টন

4
@ ওয়েভারকে এটি দেখতে এমনটি দেখাবে ...addContact(1, function(id) { console.log(id); });
ফেন্টন

4
@ স্টিভ ফেন্টন: আপনার উত্তরটি পড়ে আমি নিজেকে জিজ্ঞাসা করেছি আমি কেন জিজ্ঞাসা করেছি ... :-)
ভেভারেক

1
ECMAScript এ ক্লাস সিনট্যাক্সের পরিবর্তে একটি =চিহ্ন থাকতে হবে না । আপনার এমন পরিবেশেও চলতে হবে যা ক্লাস সিনট্যাক্সকে সমর্থন করে (সমস্ত ব্রাউজার এখনও এটি সমর্থন করে না)। আপনি যদি এখনও লড়াই করে থাকেন তবে এটি পুরো নতুন প্রশ্নের পক্ষে আরও উপযুক্ত হতে পারে কারণ আপনার সমস্যা ফাংশনগুলি পাস করার বিষয়ে নয় - এটি সাধারণ ইএস সিনট্যাক্স। class myFuncs {class myFuncs = {
ফেন্টন

337

আপনি যদি কোনও ফাংশনটি পাস করতে চান তবে কেবল বন্ধনীর নাম ছাড়াই এটি উল্লেখ করুন:

function foo(x) {
    alert(x);
}
function bar(func) {
    func("Hello World!");
}

//alerts "Hello World!"
bar(foo);

তবে কখনও কখনও আপনি যুক্তিগুলি অন্তর্ভুক্ত করে কোনও ফাংশনটি পাস করতে চাইতে পারেন , তবে কলব্যাক চালিত না হওয়া পর্যন্ত এটি কল করা হয়নি। এটি করার জন্য, যখন এটি কল করার সময়, কেবল এটির মতো একটি বেনামি কার্যে গুটিয়ে নিন:

function foo(x) {
   alert(x);
}
function bar(func) {
   func();
}

//alerts "Hello World!" (from within bar AFTER being passed)
bar(function(){ foo("Hello World!") });

আপনি যদি পছন্দ করেন তবে আপনি প্রয়োগ ফাংশনটিও ব্যবহার করতে পারেন এবং তৃতীয় প্যারামিটার থাকতে পারে যা আর্গুমেন্টের অ্যারে, যেমন:

function eat(food1, food2)
{
    alert("I like to eat " + food1 + " and " + food2 );
}
function myFunc(callback, args)
{
    //do stuff
    //...
    //execute callback when finished
    callback.apply(this, args);
}

//alerts "I like to eat pickles and peanut butter"
myFunc(eat, ["pickles", "peanut butter"]); 

70
এটিকে উচ্চতর স্থান দেওয়া উচিত কারণ তিনি যুক্তি দিয়ে কোনও ফাংশনটি কীভাবে পাস করবেন তা সম্বোধন করেন
ডেল্টানাইন ২ine


@ কম্পায়নারড 255 আমি সম্মত, এটি এবং দ্রুত অবজেক্ট লিটারালগুলি তৈরি করার ক্ষমতা আমার জাভাস্ক্রিপ্টের দুটি প্রিয় দিক। আমি সবসময় যে ভাষাগুলিতে নেই সেগুলিতে অবজেক্ট লিটারেলগুলি মিস করি।
ডালিন

3
আমি জাভাস্ক্রিপ্টের জন্য এই বৈশিষ্ট্যটি সরবরাহ করার জন্য এবং আপনি @ ডালিনের কাছে এটি উপস্থিত রয়েছে তা জানাতে আমি আপনাকে ধন্যবাদ জানাই।
দীপেন্দু পল

"এটি একটি বেনামে ফাংশনে আবদ্ধ করুন" উদাহরণস্বরূপ, যদি এটি সুস্পষ্ট না হয় তবে বেনামে ফাংশনটি নিজেই ফাংশনটি ফিরিয়ে দেয় (পরামিতি সহ) এবং যখন এটি ফ্যাঙ্কে (প্রথম) বন্ধনীতে পৌঁছায় তখন তাকে অনুরোধ করা হয়। এটি বের করার জন্য আমাকে কিছুটা সময় নিয়েছিল, তাই আমি ভেবেছিলাম এটি অন্যকে সাহায্য করতে পারে।
হাবপিক্সেল

51

উদাহরণ 1:

funct("z", function (x) { return x; });

function funct(a, foo){
    foo(a) // this will return a
}

উদাহরণ 2:

function foodemo(value){
    return 'hello '+value;
}

function funct(a, foo){
    alert(foo(a));
}

//call funct    
funct('world!',foodemo); //=> 'hello world!'

এটা দেখ


প্রথম উদাহরণে আপনার রিটার্ন কীওয়ার্ড যুক্ত করা উচিত, যেমন: ফাংশন ফান্ট (ক, ফু) {রিটার্ন ফু (ক) // এটি একটি ফেরৎ দেবে} অন্যথায় আপনি অপরিজ্ঞাত হয়ে যাবেন
আর্টেম ফেডোটভ

34

প্যারামিটার হিসাবে ফাংশনটি পাস করার জন্য, বন্ধনীগুলি সরিয়ে ফেলুন!

function ToBeCalled(){
  alert("I was called");
}

function iNeedParameter( paramFunc) {
   //it is a good idea to check if the parameter is actually not null
   //and that it is a function
   if (paramFunc && (typeof paramFunc == "function")) {
      paramFunc();   
   }
}

//this calls iNeedParameter and sends the other function to it
iNeedParameter(ToBeCalled); 

এর পিছনে ধারণাটি হ'ল কোনও ফাংশনটি ভেরিয়েবলের সাথে বেশ মিল। লেখার বদলে

function ToBeCalled() { /* something */ }

আপনি পাশাপাশি লিখতে পারে

var ToBeCalledVariable = function () { /* something */ }

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

anotherFunction(ToBeCalledVariable);

2
কেবলমাত্র typeof paramFunc == "function"যথেষ্ট, কারণ যদি এটি কলযোগ্য না হয় তবে আপনি এটিকে উপেক্ষা করতে পারেন।
জিমি নট

16

জাভাস্ক্রিপ্ট প্রোগ্রামারদের মধ্যে একটি বাক্যাংশ রয়েছে: "ইভাল ইভিল" তাই এটি কোনও মূল্যে এড়াতে চেষ্টা করুন!

স্টিভ ফেন্টনের উত্তর ছাড়াও, আপনি সরাসরি ফাংশনগুলিও পাস করতে পারেন।

function addContact(entity, refreshFn) {
    refreshFn();
}

function callAddContact() {
    addContact("entity", function() { DoThis(); });
}

8

আমি এই সমস্যাটি দিয়ে আমার সমস্ত চুল কেটে ফেলেছি। আমি উপরের উদাহরণগুলির সাথে কাজ করতে পারি না, তাই আমি এর মতো শেষ করেছি:

function foo(blabla){
    var func = new Function(blabla);
    func();
}
// to call it, I just pass the js function I wanted as a string in the new one...
foo("alert('test')");

এবং এটি একটি মনোমুগ্ধকর মত কাজ করছে ... আমার কমপক্ষে যা প্রয়োজন তার জন্য। আশা করি এটি কিছু সাহায্য করতে পারে।


6

আমি পরামিতিগুলিকে একটি অ্যারেতে রাখার পরামর্শ দিই এবং তারপরে .apply()ফাংশনটি ব্যবহার করে সেগুলি বিভক্ত করুন । সুতরাং এখন আমরা সহজেই প্রচুর পরামিতি সহ একটি ফাংশনটি পাস করতে পারি এবং এটি একটি সহজ উপায়ে কার্যকর করতে পারি।

function addContact(parameters, refreshCallback) {
    refreshCallback.apply(this, parameters);
}

function refreshContactList(int, int, string) {
    alert(int + int);
    console.log(string);
}

addContact([1,2,"str"], refreshContactList); //parameters should be putted in an array

5

আপনি eval()একই জিনিসটি করতে ব্যবহার করতে পারেন।

//A function to call
function needToBeCalled(p1, p2)
{
    alert(p1+"="+p2);
}

//A function where needToBeCalled passed as an argument with necessary params
//Here params is comma separated string
function callAnotherFunction(aFunction, params)
{
    eval(aFunction + "("+params+")");
}

//A function Call
callAnotherFunction("needToBeCalled", "10,20");

এটাই. আমিও এই সমাধানটির সন্ধান করছিলাম এবং অন্যান্য উত্তরে প্রদত্ত সমাধানগুলি চেষ্টা করেছি কিন্তু শেষ পর্যন্ত এটি উপরের উদাহরণ থেকে কার্যকর হয়েছে।


2

এখানে এটি অন্য পদ্ধতি:

function a(first,second)    
{        
return (second)(first);           
}     

a('Hello',function(e){alert(e+ ' world!');}); //=> Hello world     

2

আসলে, কিছুটা জটিল বলে মনে হচ্ছে, তাই না।

প্যারামিটার হিসাবে পদ্ধতি পান:

 function JS_method(_callBack) { 

           _callBack("called");  

        }

আপনি প্যারামিটার পদ্ধতি হিসাবে দিতে পারেন:

    JS_method(function (d) {
           //Finally this will work.
           alert(d)
    });

1
দয়া করে আপনার উত্তরটি ব্যাখ্যা করুন।
মিল্লাররো

2

অন্যান্য উত্তরগুলি কী চলছে তা বর্ণনা করার জন্য একটি দুর্দান্ত কাজ করে তবে একটি গুরুত্বপূর্ণ "গোটচা" হ'ল এটি নিশ্চিত করা যে আপনি যা যা করেন তা আসলে কোনও ফাংশনের রেফারেন্স।

উদাহরণস্বরূপ, যদি আপনি কোনও ফাংশনের পরিবর্তে স্ট্রিং দিয়ে যান তবে আপনি একটি ত্রুটি পাবেন:

function function1(my_function_parameter){
    my_function_parameter();   
}

function function2(){
 alert('Hello world');   
}

function1(function2); //This will work

function1("function2"); //This breaks!

জেএসফিডল দেখুন


0

কিছু সময় যখন আপনাকে ইভেন্ট হ্যান্ডলারের সাথে ডিল করতে হয় তাই ইভেন্টটিকে আর্গুমেন্ট হিসাবে খুব পাস করতে হবে, বেশিরভাগ আধুনিক লাইব্রেরির প্রতিক্রিয়া, কৌণিকের এটির প্রয়োজন হতে পারে।

আমাকে রিঅ্যাক্টজগুলিতে কিছু কাস্টম বৈধতা সহ অনসামিত ফাংশন (তৃতীয় পক্ষের লাইব্রেরি থেকে ফাংশন) ওভাররাইড করতে হবে এবং আমি নীচের মতো ফাংশন এবং ইভেন্ট দুটি পাশ করেছি

মূলত

    <button className="img-submit" type="button"  onClick=
 {onSubmit}>Upload Image</button>

একটি নতুন ফাংশন তৈরি করুন uploadএবং পাস onSubmitএবং ইভেন্টটিকে আর্গুমেন্ট হিসাবে ডেকে আনে

<button className="img-submit" type="button"  onClick={this.upload.bind(this,event,onSubmit)}>Upload Image</button>

upload(event,fn){
  //custom codes are done here
  fn(event);
}

-3

আপনি জেএস ফাংশনগুলি সংরক্ষণ এবং প্রেরণ করতে একটি জেএসওএন ব্যবহার করতে পারেন।

নিম্নলিখিত পরীক্ষা করুন:

var myJSON = 
{
    "myFunc1" : function (){
        alert("a");
    }, 
    "myFunc2" : function (functionParameter){
        functionParameter();
    }
}



function main(){
    myJSON.myFunc2(myJSON.myFunc1);
}

এটি 'ক' মুদ্রণ করবে।

নিম্নলিখিতগুলির উপরেরগুলির সাথে একই প্রভাব রয়েছে:

var myFunc1 = function (){
    alert('a');
}

var myFunc2 = function (functionParameter){
    functionParameter();
}

function main(){
    myFunc2(myFunc1);
}

যা নিম্নলিখিতগুলির সাথেও একইরকম প্রভাব ফেলে:

function myFunc1(){
    alert('a');
}


function myFunc2 (functionParameter){
    functionParameter();
}

function main(){
    myFunc2(myFunc1);
}

এবং অবজেক্ট প্রোটোটাইপ হিসাবে ক্লাস ব্যবহার করে একটি অবজেক্ট দৃষ্টান্ত:

function Class(){
    this.myFunc1 =  function(msg){
        alert(msg);
    }

    this.myFunc2 = function(callBackParameter){
        callBackParameter('message');
    }
}


function main(){    
    var myClass = new Class();  
    myClass.myFunc2(myClass.myFunc1);
}

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