একটি জাভাস্ক্রিপ্ট ফাংশন কীভাবে কার্যকর করতে হয় যখন আমার স্ট্রিং হিসাবে এর নাম থাকে


1050

স্ট্রিং হিসাবে আমার কাছে জাভাস্ক্রিপ্টে একটি ফাংশনের নাম রয়েছে। আমি কীভাবে এটিকে কোনও ফাংশন পয়েন্টারে রূপান্তর করব যাতে আমি পরে এটি কল করতে পারি?

পরিস্থিতিগুলির উপর নির্ভর করে, পদ্ধতিতে আমার বিভিন্ন যুক্তিও পাস করার প্রয়োজন হতে পারে।

কিছু ফাংশন রূপ নিতে পারে namespace.namespace.function(args[...])

উত্তর:


1438

evalআপনি সম্পূর্ণরূপে না থাকলে ব্যবহার করবেন না , ইতিবাচকভাবে অন্য কোনও পছন্দ নেই।

যেমনটি উল্লেখ করা হয়েছে, এরকম কিছু ব্যবহার করা সর্বোত্তম উপায় হবে:

window["functionName"](arguments);

এটি অবশ্য নামের জায়গার সাথে কাজ করবে না:

window["My.Namespace.functionName"](arguments); // fail

এইভাবে আপনি এটি করবেন:

window["My"]["Namespace"]["functionName"](arguments); // succeeds

এটি আরও সহজ করার জন্য এবং কিছুটা নমনীয়তা প্রদানের জন্য, এখানে একটি সুবিধামত কার্যকারিতা রয়েছে:

function executeFunctionByName(functionName, context /*, args */) {
  var args = Array.prototype.slice.call(arguments, 2);
  var namespaces = functionName.split(".");
  var func = namespaces.pop();
  for(var i = 0; i < namespaces.length; i++) {
    context = context[namespaces[i]];
  }
  return context[func].apply(context, args);
}

আপনি এটিকে এভাবে ডাকবেন:

executeFunctionByName("My.Namespace.functionName", window, arguments);

দ্রষ্টব্য, আপনি যে প্রসঙ্গে চান তা পাস করতে পারেন, সুতরাং এটি উপরের মতোটি করবে:

executeFunctionByName("Namespace.functionName", My, arguments);

4
আপনি কি জানেন যে পুরো "ফানক" নির্মাণের দরকার নেই? "
প্রসঙ্গ। অ্যাপ্লিকেশন

16
অবশ্যই, আমি এটি জানি - তবে আমি ফাংশনটি যেভাবে লিখেছি তা এটি পড়ার জন্য কিছু স্পষ্টতা সরবরাহ করে যা ঘটছে তা সম্পূর্ণরূপে আঁকড়ে না ফেলতে পারে। আমি এই ফাংশনটি লিখে লোকদের বুঝতে পেরে কিছু সাহায্যের প্রয়োজন হতে পারে তা লিখেছিলাম। আপনি যেহেতু জিজ্ঞাসা করেছেন আমি
ততক্ষণ

108
এটি স্ক্র্যাচ করুন - কোডটি যথেষ্ট পরিষ্কার এবং যাঁরা জানেন, জানেন। আপনি যদি আমার মতো হয়ে থাকেন এবং আপনি কী করছেন তা জানেন, আপনি যদি এই কোডটি ব্যবহার করেন তবে আপনি নিজেই এই জাতীয় পরিবর্তনগুলি করতে পারেন। স্ট্যাক ওভারফ্লো অন্যকে শিক্ষিত করার জন্য, এবং আমি মনে করি আমার কোডটি নবজাতকের পক্ষে বোঝা আরও সহজ। ধন্যবাদ যদিও!
জেসন বুটিং

4
উইন্ডো ["ফানকনাম"] অপরিবর্তিত ফিরে আসার মতো পরিস্থিতি কি আছে? এই মুহুর্তে আমার সমস্যা হচ্ছে। কলিং কোড এবং ফাংশন দুটি পৃথক জেএস ফাইলগুলিতে সংজ্ঞায়িত করা হয়। আমি তাদের একই ফাইলে যুক্ত করার চেষ্টা করেছি তবে এতে কোনও পার্থক্য হয়নি।
কোডমনকি

5
আমি মনে করি এখানে একটি সমস্যা আছে। আপনি কল যখন My.Namespace.functionName(), thisপড়ুন হবে My.Namespaceঅবজেক্ট। কিন্তু আপনি যখন কল করবেন তখন একই জিনিসটি উল্লেখ করার executeFunctionByName("My.Namespace.functionName", window)কোনও উপায় নেই this। সম্ভবত এটি সুযোগ হিসাবে সর্বশেষ নেমস্পেসটি ব্যবহার করা উচিত, বা windowযদি কোনও নামস্থান নেই sp অথবা আপনি ব্যবহারকারীর পক্ষে আর্গুমেন্ট হিসাবে সুযোগটি নির্দিষ্ট করতে পারবেন could
জেডাব্লু

100

ভেবেছিলাম আমি জেসন বুটিংয়ের খুব সহায়ক ফাংশনের কিছুটা পরিবর্তিত সংস্করণ পোস্ট করব ।

প্রথম, আমি স্লাইস () কে দ্বিতীয় প্যারামিটার সরবরাহ করে প্রথম বিবৃতিটি সহজ করে তুলেছি । আসল সংস্করণটি আইই বাদে সমস্ত ব্রাউজারে কাজ করে।

দ্বিতীয়ত, আমি প্রতিস্থাপিত হয়েছে এই সঙ্গে প্রেক্ষাপটে আগমন বিবৃতিতে; অন্যথায়, এই সবসময় নির্দেশ ছিল উইন্ডোতে যখন লক্ষ্য ফাংশন মৃত্যুদন্ড কার্যকর হচ্ছে।

function executeFunctionByName(functionName, context /*, args */) {
    var args = Array.prototype.slice.call(arguments, 2);
    var namespaces = functionName.split(".");
    var func = namespaces.pop();
    for (var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
    }
    return context[func].apply(context, args);
}

"ফাংশননেম" আসলে আছে কিনা তা দেখার জন্য কোনও চেক নেই?
ক্র্যাশলোট

আমি মনে করি ম্যাকের উত্তরটি আন্ডাররেটেড। আমি কোনও বিশেষজ্ঞ নই তবে এটি মনে করা ভাল এবং দৃ and়।
মার্টিন হ্যানসেন লেনাক্স

65

এই অন্যান্য প্রশ্নের উত্তর আপনাকে কীভাবে তা করতে দেখায়: জাভাস্ক্রিপ্ট পাইথনের স্থানীয়দের সমতুল্য ()?

মূলত, আপনি বলতে পারেন

window["foo"](arg1, arg2);

বা অন্য অনেকে যেমন পরামর্শ দিয়েছেন, আপনি কেবল ওয়াল ব্যবহার করতে পারেন:

eval(fname)(arg1, arg2);

যদিও আপনি চূড়ান্তভাবে কী করছেন সে সম্পর্কে আপনি সম্পূর্ণ নিশ্চিত না হলে এটি অত্যন্ত সুরক্ষিত।


6
প্রথম ফর্মটি আরও বেশি পছন্দনীয়
অন্নকাটা

19
কেবলমাত্র সর্বশেষ অবলম্বন হিসাবে eval ব্যবহার করুন, যখন অন্য সমস্ত ব্যর্থ হয়।
জেসন বুটিং

1
এটি ... তবে এটি কি এই জাতীয় ফাংশনগুলির সাথে কাজ করবে: xyz (আরগস)?
কাইরন

@ কেইরন: হ্যাঁ নীচে আমার উত্তরটি দেখুন
আননাকাটা

55

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

var codeToExecute = "My.Namespace.functionName()";
var tmpFunc = new Function(codeToExecute);
tmpFunc();

আপনি এই পদ্ধতিটি ব্যবহার করে অন্য কোনও জাভাস্ক্রিপ্ট কার্যকর করতে পারেন।


3
এমনকি ফাংশনটি দিয়ে যুক্তিগুলি পাস করার
পরেও

ফাংশন রিটার্ন সম্পর্কে কি?
পিটার ডেনেভ

12
কীভাবে এর থেকে আলাদা eval("My.Namespace.functionName()");?
developerbmw

@PeterDenev শুধু প্রথম লাইন পরিবর্তনvar codeToExecute = "return My.Namespace.functionName()";
developerbmw

2
@developerbmw, এখানে উত্তর stackoverflow.com/questions/4599857/...
Tejasvi হেগড়ে

47

আমি মনে করি এটি করার একটি মার্জিত উপায় হ্যাশ অবজেক্টে আপনার ফাংশনগুলি সংজ্ঞায়িত করা। তারপরে আপনার স্ট্রিংটি ব্যবহার করে হ্যাশ থেকে functions ফাংশনগুলির একটি রেফারেন্স থাকতে পারে। যেমন

var customObject = {
  customFunction: function(param){...}
};

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

customObject['customFunction'](param);

যেখানে কাস্টমফাংশনটি আপনার অবজেক্টে সংজ্ঞায়িত কোনও ফাংশনের সাথে মেলে একটি স্ট্রিং হবে।


@ বিসেনভ, আমাকে এই প্রতিক্রিয়াটিকে সেরা হিসাবে চিহ্নিত করতে সহায়তা করার জন্য আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি ফাংশন অবজেক্টগুলির একটি অ্যারে তৈরি করেছি এবং পরিবর্তে এটি ডিফারড.প্রোমাইজের একটি অ্যারে তৈরি করতে ব্যবহৃত হয়েছিল। আমি নীচে কিছু নমুনা কোড রেখেছি। (আমি একটি নতুন উত্তর তৈরি করতে এবং রুবেনের প্রতিক্রিয়া ধার নিতে
চাইনি

ফাংশন getMyData (অ্যারেঅফঅবজেক্টস উইথআইডস) {var ফাংশনআরে = অ্যারেঅফবজবটস উইথআইডস.ম্যাপ (ফাংশন (মান) {রিটার্ন {মাইগেটডাটা ফাংশন: মাই সার্ভিস q.defer (); getDataFunction.myGetDataFunction.success (ফাংশন (ডেটা) {deferred.resolve (ডেটা)।)। ত্রুটি (ফাংশন (ত্রুটি) {deferred.reject ();}); ফেরত ডিফারড.প্রোমিজ;});) । q.all (প্রতিশ্রুতি) then
ব্যবহারকারী 216661

এটি দুর্দান্ত কাজ করে আমি যাচাই করার জন্য কেবল আন্ডারস্কোর / লোডাশ যুক্ত করি এটির কোনও ফাংশন। এবং তারপরে চালান
এল্পারফিরিও

34

ES6 এর মাধ্যমে আপনি নাম অনুসারে শ্রেণি পদ্ধতিতে অ্যাক্সেস করতে পারবেন:

class X {
  method1(){
    console.log("1");
  }
  method2(){
    this['method1']();
    console.log("2");
  }
}
let x  = new X();
x['method2']();

আউটপুট হবে:

1
2

1
সেরা জাভাস্ক্রিপ্ট খাঁটি ... ..শ্বর .. ক্লাসটি কাজ করছে না এবং এটি ঠিক আছে মুছুন। ধন্যবাদ!
কিংআাইডার

1
এই জিনিসটি আমি দীর্ঘদিন থেকে খুঁজছিলাম। ধন্যবাদ!
পালাদিএন

ES2015 এর এখানে করার কিছুই নেই। খাঁটি অবজেক্টস বা প্রোটোটাইপ প্রতিনিধি ব্যবহার করে আপনি একই লক্ষ্য অর্জন করতে পারেন Object.create()। my myObj = {মেথড 1 () {কনসোল.লগ ('1')}, মেথড 2 () so কনসোল.লগ ('2')} O মওবজ ['মেথড 1'] (); // 1 মওবজ ['পদ্ধতি 2'] (); // 2
স্মিনিটোলি

1
এই সোনার !!! আমি অবাক হয়েছি আমি এর আগে এর আগে কখনও ভাবিনি। নিস !!!
thxmike

আমি আরও মনে করি এটি আমাদের লক্ষ্য অর্জনের সবচেয়ে নিকৃষ্টতম উপায় way
ক্রিস জং

24

দুটি জিনিস:

  • খারাপ এড়ান, এটি মারাত্মক বিপজ্জনক এবং ধীর

  • দ্বিতীয়ত আপনার ফাংশনটি কোথায় আছে তা বিবেচ্য নয়, "গ্লোবাল" -তা অপ্রাসঙ্গিক। x.y.foo()মাধ্যমে সক্ষম করা যাবে x.y['foo']()বা x['y']['foo']()বা এমনকি window['x']['y']['foo']()। আপনি অনির্দিষ্টকালের জন্য এইভাবে চেইন করতে পারেন।


1
তবে আপনি xyz () কল করতে উইন্ডো ['xyz'] () করতে পারবেন না
নিকফ ডেস্ক

17

সমস্ত উত্তর ধরে নেওয়া হয় যে গ্লোবাল স্কোপ (উইন্ডো) এর মাধ্যমে ফাংশনগুলি অ্যাক্সেস করা যায়। তবে ওপি এই অনুমানটি করেনি।

যদি ফাংশনগুলি স্থানীয় স্কোপে থাকে (ওরফে ক্লোজার) এবং অন্য কোনও স্থানীয় অবজেক্টের দ্বারা এটি উল্লেখ না করা হয় তবে দুর্ভাগ্য: আপনাকে eval()এএফএআইকি ব্যবহার করতে হবে , জাভাস্ক্রিপ্টে গতিশীলভাবে স্থানীয় ফাংশনটি কল করুন দেখুন


2
বাবু (বা দুদেট), এটি নির্দেশ করার জন্য আপনাকে অনেক ধন্যবাদ! আমি ভেবেছিলাম আমি এক সেকেন্ডের জন্য পাগল হয়ে যাচ্ছি।
Funktr0n 16'14

13

আপনাকে কেবল আপনার স্ট্রিংকে পয়েন্টারে রূপান্তর করতে হবে window[<method name>]। উদাহরণ:

var function_name = "string";
function_name = window[function_name];

এবং এখন আপনি এটি পয়েন্টারের মতো ব্যবহার করতে পারেন।


এটি অনেক বেশি নিরাপদ উপায় বলে মনে হচ্ছে।
জেমস পোলুস

12

জেসন বুটিংয়ের / অ্যালেক্স নাজারভের দুর্দান্ত উত্তরে আমার অবদান এখানে, যেখানে আমি ক্র্যাশলোট দ্বারা অনুরোধ করা ত্রুটি পরীক্ষা করা অন্তর্ভুক্ত।

এটি প্রদত্ত (অনুমোদিত)

a = function( args ) {
    console.log( 'global func passed:' );
    for( var i = 0; i < arguments.length; i++ ) {
        console.log( '-> ' + arguments[ i ] );
    }
};
ns = {};
ns.a = function( args ) {
    console.log( 'namespace func passed:' );
    for( var i = 0; i < arguments.length; i++ ) {
        console.log( '-> ' + arguments[ i ] ); 
    }
};
name = 'nsa';
n_s_a = [ 'Snowden' ];
noSuchAgency = function(){};

তারপরে নিম্নলিখিত ফাংশন:

function executeFunctionByName( functionName, context /*, args */ ) {
    var args, namespaces, func;

    if( typeof functionName === 'undefined' ) { throw 'function name not specified'; }

    if( typeof eval( functionName ) !== 'function' ) { throw functionName + ' is not a function'; }

    if( typeof context !== 'undefined' ) { 
        if( typeof context === 'object' && context instanceof Array === false ) { 
            if( typeof context[ functionName ] !== 'function' ) {
                throw context + '.' + functionName + ' is not a function';
            }
            args = Array.prototype.slice.call( arguments, 2 );

        } else {
            args = Array.prototype.slice.call( arguments, 1 );
            context = window;
        }

    } else {
        context = window;
    }

    namespaces = functionName.split( "." );
    func = namespaces.pop();

    for( var i = 0; i < namespaces.length; i++ ) {
        context = context[ namespaces[ i ] ];
    }

    return context[ func ].apply( context, args );
}

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

নমুনা আউটপুটটি দেখায় যে এটি কীভাবে কাজ করে:

// calling a global function without parms
executeFunctionByName( 'a' );
  /* OUTPUT:
  global func passed:
  */

// calling a global function passing a number (with implicit window context)
executeFunctionByName( 'a', 123 );
  /* OUTPUT:
  global func passed:
  -> 123
  */

// calling a namespaced function without parms
executeFunctionByName( 'ns.a' );
  /* OUTPUT:
  namespace func passed:
  */

// calling a namespaced function passing a string literal
executeFunctionByName( 'ns.a', 'No Such Agency!' );
  /* OUTPUT:
  namespace func passed:
  -> No Such Agency!
  */

// calling a namespaced function, with explicit context as separate arg, passing a string literal and array 
executeFunctionByName( 'a', ns, 'No Such Agency!', [ 007, 'is the man' ] );
  /* OUTPUT:
  namespace func passed:
  -> No Such Agency!
  -> 7,is the man
  */

// calling a global function passing a string variable (with implicit window context)
executeFunctionByName( 'a', name );
  /* OUTPUT:
  global func passed:
  -> nsa
  */

// calling a non-existing function via string literal
executeFunctionByName( 'n_s_a' );
  /* OUTPUT:
  Uncaught n_s_a is not a function
  */

// calling a non-existing function by string variable
executeFunctionByName( n_s_a );
  /* OUTPUT:
  Uncaught Snowden is not a function
  */

// calling an existing function with the wrong namespace reference
executeFunctionByName( 'a', {} );
  /* OUTPUT:
  Uncaught [object Object].a is not a function
  */

// calling no function
executeFunctionByName();
  /* OUTPUT:
  Uncaught function name not specified
  */

// calling by empty string
executeFunctionByName( '' );
  /* OUTPUT:
  Uncaught  is not a function
  */

// calling an existing global function with a namespace reference
executeFunctionByName( 'noSuchAgency', ns );
  /* OUTPUT:
  Uncaught [object Object].noSuchAgency is not a function
  */

ডুনো ... এটি খুব ভাল প্রচেষ্টা, এটি পরিষ্কার। তবে আমার কাছে "খুব বিস্তৃত" শোনার মতো ...
টেকনাইকুইস্ট

2
তাই না? এসও একটি প্রশ্ন / উত্তর / শিক্ষণ প্ল্যাটফর্ম। আশা করি আলোকসজ্জা জানাতে আমি যে সমস্ত উদাহরণগুলি ভাবতে পারি সেগুলি আমি আনন্দের সাথে সরবরাহ করব। আমার কাছে এটাই কথা
ম্যাক 18

আপনি যদি যাইহোক ফাংশন নামটি ব্যাখ্যা করছেন, তবে কেন কেবল এটি ব্যবহার করবেন না?
ডেটা

এটি আমার পক্ষে কাজ করে না। আমার একটি নেমস্পিড ফাংশন abcd আছে যেখানে ফাংশনটির নাম। কল এক্সিকিউটফাইন্যেশনবাইনেম ("abcd", উইন্ডো) লাইনে ব্যর্থ হয় যা পরীক্ষা করে if( typeof context[ functionName ] !== 'function' )কারণ প্রসঙ্গ - উইন্ডো - সংজ্ঞায়িত করা হয়, একটি বস্তু এবং একটি অ্যারে, তবে উইন্ডো ['abcd'] অস্তিত্বহীন হিসাবে গৃহীত সমস্যা হিসাবে চিহ্নিত হয়েছিল উত্তর: window["My.Namespace.functionName"](arguments); // fail
আকস্মাতা

12

আপনি কোথায় আছেন তার উপর নির্ভর করে আপনি এটি ব্যবহার করতে পারেন:

this["funcname"]();
self["funcname"]();
window["funcname"]();
top["funcname"]();
globalThis["funcname"]();

বা, নোডেজে

global["funcname"]()

9

আপনি যদি কোনও গ্লোবাল ফাংশনের পরিবর্তে কোনও অবজেক্টের ফাংশনটিতে কল করতে চান window["functionName"]। আপনি এটি মত করতে পারেন;

var myObject=new Object();
myObject["functionName"](arguments);

উদাহরণ:

var now=new Date();
now["getFullYear"]()

8

সাবধান হও!!!

দুটি কারণে জাভাস্ক্রিপ্টে স্ট্রিং করে একটি ফাংশন কল করা এড়াতে চেষ্টা করা উচিত:

কারণ 1: কিছু কোড obfuscators আপনার কোডটি নষ্ট করবে কারণ তারা ফাংশনটির নাম পরিবর্তন করবে এবং স্ট্রিংটিকে অবৈধ করে তুলবে।

কারণ 2: কোডটি বজায় রাখা খুব কঠিন যা এই পদ্ধতিটি ব্যবহার করে এটি স্ট্রিং দ্বারা আহৃত পদ্ধতিগুলির ব্যবহারগুলি সনাক্ত করা আরও শক্ত।


7

এখানে আমার এস approach পদ্ধতিটি যা আপনাকে আপনার ফাংশনটির নাম দিয়ে স্ট্রিং বা এটির ফাংশন নাম হিসাবে কল করতে সক্ষম করে এবং বিভিন্ন ধরণের ফাংশনে বিভিন্ন সংখ্যক যুক্তি উপস্থাপন করতে সক্ষম করে:

function fnCall(fn, ...args)
{
  let func = (typeof fn =="string")?window[fn]:fn;
  if (typeof func == "function") func(...args);
  else throw new Error(`${fn} is Not a function!`);
}


function example1(arg1){console.log(arg1)}
function example2(arg1, arg2){console.log(arg1 + "  and   " + arg2)}
function example3(){console.log("No arguments!")}

fnCall("example1", "test_1");
fnCall("example2", "test_2", "test3");
fnCall(example3);
fnCall("example4"); // should raise an error in console


6

সেটটাইমআউটের কোনও উল্লেখ না দেখে অবাক।

যুক্তি ছাড়াই একটি ফাংশন চালাতে:

var functionWithoutArguments = function(){
    console.log("Executing functionWithoutArguments");
}
setTimeout("functionWithoutArguments()", 0);

যুক্তি সহ ফাংশন চালাতে:

var functionWithArguments = function(arg1, arg2) {
    console.log("Executing functionWithArguments", arg1, arg2);
}
setTimeout("functionWithArguments(10, 20)");

গভীরভাবে নেমস্পিড ফাংশন চালাতে:

var _very = {
    _deeply: {
        _defined: {
            _function: function(num1, num2) {
                console.log("Execution _very _deeply _defined _function : ", num1, num2);
            }
        }
    }
}
setTimeout("_very._deeply._defined._function(40,50)", 0);

এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন - আপনি সর্বদা আপনার নিজের পোস্টে মন্তব্য করতে পারেন, এবং আপনার যথেষ্ট সুনামের পরে আপনি কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন ।
অ্যাস্ট্রোসিবি

আপনি কীভাবে runMeকয়েকটি যুক্তি দিয়ে কল করবেন তার একটি উদাহরণ যোগ করুন ।
অভিধান 21

1
@ অ্যালেক্সিকোর আমি একটি পর্যালোচনা সারিতে মুছে ফেলার পক্ষে মতামত দিয়েছি , কারণ এটি পরিষ্কারভাবে প্রশ্নের উত্তরের জবাব সরবরাহ করে না এবং এটি নিজেরাই খুব কম মূল্যবান।
অ্যাস্ট্রোসিবি

1
এই পদ্ধতি, সম্ভাব্য বিশাল ত্রুটি হয়েছে যেমন মৃত্যুদন্ড থেকে রাখে রেন্ডারিং শেষ কিউ, এইভাবে তৈরীর এই কলে asynchronious
PeterM

1
আমি এই উত্তরটি পছন্দ করি, এটি আমার প্রয়োজনীয়তার জন্য কাজ করে বলে মনে হচ্ছে।
কুইন্টন

3

সুতরাং, অন্যদের মতো বলেছেন, অবশ্যই সর্বোত্তম বিকল্পটি হ'ল:

window['myfunction'](arguments)

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

window['myobject.myfunction'](arguments); // won't work
window['myobject']['myfunction'](arguments); // will work

সুতরাং এখানে আমার একটি ফাংশনের সংস্করণ যা নাম অনুসারে সমস্ত ফাংশন সম্পাদন করবে (কোনও অবজেক্ট সহ বা নাও):

my = {
    code : {
        is : {
            nice : function(a, b){ alert(a + "," + b); }
        }
    }
};

guy = function(){ alert('awesome'); }

function executeFunctionByName(str, args)
{
    var arr = str.split('.');
    var fn = window[ arr[0] ];
    
    for (var i = 1; i < arr.length; i++)
    { fn = fn[ arr[i] ]; }
    fn.apply(window, args);
}

executeFunctionByName('my.code.is.nice', ['arg1', 'arg2']);
executeFunctionByName('guy');


3
  let t0 = () => { alert('red0') }
  var t1 = () =>{ alert('red1') }
  var t2 = () =>{ alert('red2') }
  var t3 = () =>{ alert('red3') }
  var t4 = () =>{ alert('red4') }
  var t5 = () =>{ alert('red5') }
  var t6 = () =>{ alert('red6') }

  function getSelection(type) {
    var evalSelection = {
      'title0': t0,
      'title1': t1,
      'title2': t2,
      'title3': t3,
      'title4': t4,
      'title5': t5,
      'title6': t6,
      'default': function() {
        return 'Default';
      }
    };
    return (evalSelection[type] || evalSelection['default'])();
  }
  getSelection('title1');

আরও একটি ওওপি সমাধান ...


2

জেসন এবং অ্যালেক্সের পোস্টগুলিতে আরও একটি বিবরণ। আমি প্রসঙ্গে ডিফল্ট মান যুক্ত করা সহায়ক বলে মনে করেছি। শুধু context = context == undefined? window:context;ফাংশন শুরুতে রাখা । windowআপনার পছন্দের প্রসঙ্গটি আপনি যে কোনওটিতে পরিবর্তন করতে পারেন এবং তারপরে প্রতিবার আপনার ডিফল্ট প্রসঙ্গে আপনি যখন কল করবেন তখন আপনাকে একই ভেরিয়েবলটি পাস করতে হবে না।


2

জেসন বুটিংয়ের উত্তর যুক্ত করতে, আপনি যদি নোডেজ বা অন্য কিছু ব্যবহার করেন (এবং এটি ডম জেএসেও কাজ করে) তবে আপনি এর thisপরিবর্তে ব্যবহার করতে পারেন window(এবং মনে রাখবেন: alভালটি খারাপ :

this['fun'+'ctionName']();

2

আমার কোডে একটি খুব অনুরূপ জিনিস আছে। আমার একটি সার্ভার-উত্পন্ন স্ট্রিং রয়েছে যাতে একটি ফাংশন নাম রয়েছে যা আমাকে তৃতীয় পক্ষের লাইব্রেরির কলব্যাক হিসাবে পাস করতে হবে। সুতরাং আমার কাছে একটি কোড রয়েছে যা স্ট্রিং নেয় এবং ফাংশনে একটি "পয়েন্টার" দেয় বা এটি খুঁজে না পাওয়া গেলে শূন্য।

আমার সমাধান " জেসন বুটিংয়ের খুব সহায়ক ফাংশন " * এর সাথে খুব মিল ছিল , যদিও এটি স্বয়ংক্রিয়ভাবে চালিত হয় না এবং প্রসঙ্গটি সর্বদা উইন্ডোতে থাকে। তবে এটি সহজেই সংশোধন করা যায়।

আশা করি এটি কারও সহায়ক হবে।

/**
 * Converts a string containing a function or object method name to a function pointer.
 * @param  string   func
 * @return function
 */
function getFuncFromString(func) {
    // if already a function, return
    if (typeof func === 'function') return func;

    // if string, try to find function or method of object (of "obj.func" format)
    if (typeof func === 'string') {
        if (!func.length) return null;
        var target = window;
        var func = func.split('.');
        while (func.length) {
            var ns = func.shift();
            if (typeof target[ns] === 'undefined') return null;
            target = target[ns];
        }
        if (typeof target === 'function') return target;
    }

    // return null if could not parse
    return null;
}


1

আমি অন্য কৌতুকটি উল্লেখ করে প্রতিহত করতে পারি না, যা যদি আপনার অজানা সংখ্যক যুক্তি রয়েছে যা ফাংশনটির নাম সহ স্ট্রিংয়ের অংশ হিসাবে পাস করা হয় তবে তা সহায়তা করে। উদাহরণ স্বরূপ:

var annoyingstring = 'call_my_func(123, true, "blah")';

আপনার জাভাস্ক্রিপ্ট যদি কোনও HTML পৃষ্ঠায় চলমান থাকে তবে আপনার যা দরকার তা একটি অদৃশ্য লিঙ্ক; আপনি onclickবৈশিষ্ট্যের মধ্যে একটি স্ট্রিং এবং কল clickপদ্ধতিতে পাস করতে পারেন ।

<a href="#" id="link_secret"><!-- invisible --></a>

$('#link_secret').attr('onclick', annoyingstring);
$('#link_secret').click();

অথবা <a>রানটাইমের সময় উপাদানটি তৈরি করুন ।


সৃজনশীল সমাধান, তবে এটি অবজেক্ট বা অ্যারের ধরণের আর্গুমেন্টের জন্য কাজ করবে না।
ডেনিস হেইডেন

1
এটি হুডের নীচে ইওল ব্যবহার করছে ... এবং এটি করার জন্য ঝোপের চারপাশে সত্যিই মারধর করছে
জুয়ান মেন্ডেস

1

সবচেয়ে সহজ উপায় এটির মতো উপাদান অ্যাক্সেস করা

window.ClientSideValidations.forms.location_form

হিসাবে একই

window.ClientSideValidations.forms['location_form']

1

আপনি eval("functionname as string")উভয়ের মধ্যে জাভাস্ক্রিপ্ট ফাংশন কল করতে পারেন । নীচের মত: (eval খাঁটি জাভাস্ক্রিপ্ট ফাংশন)

function testfunc(){
    return "hello world";
}

$( document ).ready(function() {

     $("div").html(eval("testfunc"));
});

কার্যকারী উদাহরণ: https://jsfiddle.net/suatatan/24ms0fna/4/


এটি সূক্ষ্মভাবে কাজ করে এবং এটি এত সহজ
কার্লোস ই

1
এবং সত্যিই ধীর।
মার্কো

1

এটি আমার পক্ষে কাজ করছে:

var command = "Add";
var tempFunction = new Function("Arg1","Arg2", "window." + command + "(Arg1,Arg2)");
tempFunction(x,y);

আশা করি এটি কাজ করবে.


1

আমি মনে করি না যে আপনার জটিল মধ্যবর্তী ফাংশন প্রয়োজন বা উইন্ডো যেমন গ্লোবাল ভেরিয়েবল উপর নির্ভরশীল:

function fun1(arg) {
  console.log(arg);
}

function fun2(arg) {
  console.log(arg);
}

const operations = {
  fun1,
  fun2
};

let temp = "fun1";

try {
  // You have to use square brackets property access
  operations["fun1"]("Hello World");
  operations["fun2"]("Hello World");
  // You can use variables
  operations[temp]("Hello World");
} catch (error) {
  console.error(error);
}

এটি আমদানি করা ফাংশনগুলির সাথেও কাজ করবে:

// mode.js
export function fun1(arg) {
  console.log(arg);
}

export function fun2(arg) {
  console.log(arg);
}
// index.js
import { fun1, fun2 } from "./mod";

const operations = {
  fun1,
  fun2
};

try {
  operations["fun1"]("Hello World");
  operations["fun2"]("Hello World");
} catch (error) {
  console.error(error);
}

0

ব্যবহার না করে eval('function()')আপনি ব্যবহার করে একটি নতুন ফাংশন তৈরি করতে পারেন new Function(strName)। নীচের কোডটি এফএফ, ক্রোম, আইই ব্যবহার করে পরীক্ষা করা হয়েছিল।

<html>
<body>
<button onclick="test()">Try it</button>
</body>
</html>
<script type="text/javascript">

  function test() {
    try {    
        var fnName = "myFunction()";
        var fn = new Function(fnName);
        fn();
      } catch (err) {
        console.log("error:"+err.message);
      }
  }

  function myFunction() {
    console.log('Executing myFunction()');
  }

</script>

0
use this

function executeFunctionByName(functionName, context /*, args */) {
      var args = [].slice.call(arguments).splice(2);
      var namespaces = functionName.split(".");
      var func = namespaces.pop();
      for(var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
      }
      return context[func].apply(context, args);
    }

1
কেন? ব্যাখ্যা ব্যতীত উত্তরগুলি সম্ভবত অকেজো।
ড্যানিয়েল ডাব্লু।

0

বেসিক চেহারা:

var namefunction = 'jspure'; // String

function jspure(msg1 = '', msg2 = '') { 
  console.log(msg1+(msg2!=''?'/'+msg2:''));
} // multiple argument

// Results ur test
window[namefunction]('hello','hello again'); // something...
eval[namefunction] = 'hello'; // use string or something, but its eval just one argument and not exist multiple

অন্য ধরনের ফাংশন নাই হয় বর্গ এবং চেহারা উদাহরণস্বরূপ Nils petersohn


0

খুব সহায়ক উত্তরের জন্য ধন্যবাদ। আমি আমার প্রকল্পগুলিতে জেসন বুটিংয়ের ফাংশনটি ব্যবহার করছি ।

Itচ্ছিক সময়সীমা সহ এটি ব্যবহার করার জন্য আমি এটি প্রসারিত করেছি, কারণ একটি সময়সীমা নির্ধারণের স্বাভাবিক উপায়টি কাজ করবে না। দেখুন abhishekisnot প্রশ্ন

function executeFunctionByName(functionName, context, timeout /*, args */ ) {
	var args = Array.prototype.slice.call(arguments, 3);
	var namespaces = functionName.split(".");
	var func = namespaces.pop();
	for (var i = 0; i < namespaces.length; i++) {
		context = context[namespaces[i]];
	}
	var timeoutID = setTimeout(
		function(){ context[func].apply(context, args)},
		timeout
	);
    return timeoutID;
}

var _very = {
    _deeply: {
        _defined: {
            _function: function(num1, num2) {
                console.log("Execution _very _deeply _defined _function : ", num1, num2);
            }
        }
    }
}

console.log('now wait')
executeFunctionByName("_very._deeply._defined._function", window, 2000, 40, 50 );

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