Pertanyaan Bagaimana menjalankan fungsi JavaScript ketika saya memiliki namanya sebagai string


Saya memiliki nama fungsi dalam JavaScript sebagai string. Bagaimana cara mengonversinya menjadi penunjuk fungsi sehingga saya bisa meneleponnya nanti?

Bergantung pada situasinya, saya mungkin perlu menyampaikan berbagai argumen ke dalam metode juga.

Beberapa fungsi dapat berbentuk namespace.namespace.function(args[...]).


848
2017-12-11 15:47


asal


Jawaban:


Jangan gunakan eval kecuali kamu tentu saja, secara positif tidak punya pilihan lain.

Seperti yang telah disebutkan, menggunakan sesuatu seperti ini akan menjadi cara terbaik untuk melakukannya:

window["functionName"](arguments);

Namun, itu tidak akan berfungsi dengan fungsi namespace'd:

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

Ini adalah bagaimana Anda akan melakukannya:

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

Agar lebih mudah dan memberikan fleksibilitas, berikut adalah fungsi kenyamanan:

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);
}

Anda akan menyebutnya seperti ini:

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

Catatan, Anda dapat lulus dalam konteks apa pun yang Anda inginkan, jadi ini akan melakukan hal yang sama seperti di atas:

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

1224
2017-12-11 16:15



Hanya berpikir saya akan memposting versi yang sedikit diubah Fungsi Jason Bunting sangat membantu.

Pertama, saya telah menyederhanakan pernyataan pertama dengan memberikan parameter kedua ke mengiris(). Versi asli bekerja dengan baik di semua browser kecuali IE.

Kedua, saya telah diganti ini dengan konteks dalam pernyataan pengembalian; jika tidak, ini selalu menunjuk ke jendela ketika fungsi target sedang dieksekusi.

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);
}

89
2017-12-04 02:16



Jawaban atas pertanyaan lain ini menunjukkan Anda bagaimana melakukan itu: Setara Javascript dari penduduk setempat Python ()?

Pada dasarnya, Anda bisa berkata

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

atau seperti yang disarankan banyak orang, Anda bisa menggunakan eval:

eval(fname)(arg1, arg2);

meskipun ini sangat tidak aman kecuali Anda benar-benar yakin tentang apa yang Anda eval-ing.


51
2017-12-11 15:49



Bisakah Anda tidak melakukan ini:

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

Anda juga dapat menjalankan JavaScript lainnya menggunakan metode ini.


43
2017-08-16 20:56



Saya pikir cara yang elegan untuk melakukan ini adalah dengan mendefinisikan fungsi Anda dalam objek hash. Maka Anda dapat memiliki referensi ke fungsi-fungsi dari hash menggunakan string. misalnya

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

Kemudian Anda dapat menghubungi:

customObject['customFunction'](param);

Di mana customFunction akan menjadi string yang cocok dengan fungsi yang didefinisikan dalam objek Anda.


29
2018-06-02 17:13



Dua hal:

  • hindari eval, itu sangat berbahaya dan lambat

  • kedua, tidak masalah di mana fungsi Anda ada, "global" -tetap tidak relevan. x.y.foo() dapat diaktifkan melalui x.y['foo']() atau x['y']['foo']() atau bahkan window['x']['y']['foo'](). Anda dapat berantai tanpa batas seperti ini.


21
2017-12-11 16:01



Dengan ES6 Anda dapat mengakses metode kelas dengan nama:

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

hasilnya adalah:

1
2

18
2017-07-08 10:22



Anda hanya perlu mengubah string Anda menjadi penunjuk window[<method name>]. contoh:

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

dan sekarang Anda dapat menggunakannya seperti penunjuk.


12
2017-11-11 18:22



Semua jawaban menganggap bahwa fungsi dapat diakses melalui ruang lingkup global (alias jendela). Namun, OP tidak membuat asumsi ini.

Jika fungsi tinggal dalam lingkup lokal (alias penutupan) dan tidak direferensikan oleh beberapa objek lokal lainnya, nasib buruk: Anda harus menggunakan eval () AFAIK, lihat secara dinamis memanggil fungsi lokal di javascript


12
2018-02-04 18:03