传递一个 JavaScript 函数作为参数

IT技术 javascript function parameters
2021-01-19 22:21:23

如何将函数作为参数传递而不在“父”函数中执行函数或使用eval()(因为我读过它是不安全的。)

我有这个:

addContact(entityId, refreshContactList());

它有效,但问题是refreshContactList在调用函数时触发,而不是在函数中使用时触发。

我可以使用 来解决它eval(),但根据我所阅读的内容,这不是最佳实践。如何在 JavaScript 中将函数作为参数传递?

6个回答

您只需要删除括号:

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);
基于这个问题,回调不接受参数,这就是我将它们排除在示例之外的原因。我会添加一个评论。
2021-03-10 22:21:23
ECMAScript 中的类语法不会有=符号...class myFuncs {而不是class myFuncs = {. 您还需要在支持类语法的环境中运行(并非所有浏览器都支持它)。如果您仍在挣扎,它可能更适合于一个全新的问题,因为您的问题与传递函数无关——它是通用的 ES 语法。
2021-03-14 22:21:23
@Steve Fenton:在阅读您的回复后,我问自己为什么要问... :-)
2021-03-15 22:21:23
@Veverke 看起来像这样...... addContact(1, function(id) { console.log(id); });
2021-03-18 22:21:23
如何App.ThisFunction("show")在另一个上调用这个函数?例如: myotherfunction("arg1",App.ThisFunction("show"));和 myotherfunction 是 ---> myotherfunction('arg1',func){ func; }HOW????????????????????????
2021-03-25 22:21:23

如果要传递函数,只需按名称引用,不带括号:

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

如果您愿意,也可以使用apply函数并使用第三个参数作为参数数组,例如:

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"]); 
有什么东西,我会加入到这是独此功能-能够通过JavaScript函数的参数或变量或类似的-是的特征,使得JavaScript的如此强大,如此伟大的代码英寸
2021-03-11 22:21:23
这应该排名更高,因为他还解决了如何传递带参数的函数
2021-03-18 22:21:23
我非常感谢 Javascript 提供此功能,并感谢您@dallin 让我知道它存在。
2021-03-21 22:21:23
对于“将其包装在匿名函数中”示例,如果不明显,匿名函数返回函数本身(带参数),并在到达 func() 中的括号时调用。这花了我一段时间才弄明白,所以我认为它可能会帮助其他人。
2021-03-28 22:21:23
这是所有答案中最清晰、最令人满意的。
2021-04-06 22:21:23

示例 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!'

看这个

在第一个示例中,您应该添加 return 关键字,如下所示: function funct(a, foo){ return foo(a) // 这将返回一个 } 否则您将得到 undefined
2021-04-06 22:21:23

要将函数作为参数传递,只需删除括号即可!

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);
typeof paramFunc == "function"足够了,因为如果它不可调用,那么您可以忽略它。
2021-03-25 22:21:23

JavaScript 程序员中有一句话:“Eval is Evil”所以要不惜一切代价避免它!

除了史蒂夫芬顿的回答,您还可以直接传递函数。

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

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