# Dynamic function call - eval alternative

**URL:** https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492
**Category:** General
**Created:** [20 December 2021 17:12 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492 "2021-12-20T17:12:39Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![bakman2](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/bakman2/32/6207_2.png) [@bakman2](https://discourse.nodered.org/u/bakman2)
#### Post date: [20 December 2021 17:12 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492/1 "2021-12-20T17:12:39Z")

</div>

Lets say i have function node that implements various api functions and I want to dynamically call those functions based on a msg property. In the browser one would call the `windows[fn]` but that is not available in nodejs, eval is possible, but generally not recommended. Is there better way (other than doing if/else if)?

```auto
function start(id){...}
function stop(id){...}

let fn = msg.payload.fn // start 
let id = msg.payload.id  
eval(`${fn}(${id})`);

```

---

<div class="post-metadata">

### Author: ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)
#### Post date: [20 December 2021 17:15 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492/2 "2021-12-20T17:15:56Z")

</div>

Put the code into an externnal module file and load it into the global vars in your settings.js

Then you can refernce it in a function node simply by doing a global.get.

---

<div class="post-metadata">

### Author: ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)
#### Post date: [20 December 2021 17:16 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492/3 "2021-12-20T17:16:09Z")

</div>

Define your functions as properties of an object so you can reference them. (Which is what the window object basically is in the browser).

```auto
const myFuncs = {
   start: function(id) { ... },
   stop: function(id) { ... }
}
let fn = msg.payload.fn // start 
let id = msg.payload.id

myFuncs[fn](id)

```

---

<div class="post-metadata">

### Author: ![bakman2](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/bakman2/32/6207_2.png) [@bakman2](https://discourse.nodered.org/u/bakman2)
#### Post date: [20 December 2021 17:18 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492/4 "2021-12-20T17:18:48Z")

</div>

Ah yeah ofcourse, the penny has dropped thanks, makes perfect sense.

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)
#### Post date: [3 January 2022 17:19 UTC](https://discourse.nodered.org/t/dynamic-function-call-eval-alternative/55492/5 "2022-01-03T17:19:46Z")

</div>

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.
