【问题标题】:pass argument to function passed as argument to jQuery function将参数传递给函数作为参数传递给 jQuery 函数
【发布时间】:2013-01-27 22:45:02
【问题描述】:

Passing function name as a parameter to another function 似乎不适合我。

我已经尝试了我能找到的每篇文章的每一种变体。目前,我在一个 js 文件中有这个:

function callThisPlease (testIt){
    alert(testIt);
}

$(document).ready(function () {
    $.fn.pleaseCallTheOtherFunction('callThisPlease');
});

我有这个在另一个:

$(document).ready(function () {

    $.fn.pleaseCallTheOtherFunction = function(functionName){
        window[functionName].apply('works');
    }

});

chrome 控制台显示Uncaught TypeError: Cannot call method 'apply' of undefined

请帮忙。非常感谢!

【问题讨论】:

  • 重新编辑:您现在正在传递函数本身。如果提前知道函数名称,则无需将字符串传递给window[...]。只需functionName("works")
  • 您的编辑消失了。我想知道为什么没有显示修订历史记录。
  • 您添加的信息似乎与之前的信息相矛盾。我认为您需要退后一步,详细描述您的需求。

标签: javascript jquery function argument-passing


【解决方案1】:

如果在window 上未定义该方法,则意味着您的函数不是全局的。让它成为一个全局函数。


另外,你可以摆脱.apply。目前,您将 'works' 作为 this 值传递。

window[functionName]('works');

【讨论】:

  • 不,这不是问题所在。看看另一个答案。
  • @Cerbrus:如果 OP 想要通过字符串名称调用该函数,这就是问题所在......就像该名称来自某个外部源一样。另一个答案不起作用,因为该函数将用作window 的属性名称。
  • @Cerbrus:公平地说,这个问题有点不清楚。很难说最终需要什么。如果要对函数名称进行硬编码,那么我同意应该传递函数本身而不是字符串。
  • @JoeCoderGuy:要使其全局化,在任何其他函数之外声明它,或显式将其分配给window,如window.callThisPlease = function() { ... };
  • 您似乎正在从两个答案中获取点点滴滴,并试图将它们结合起来。这里的两个答案非常不同,因为我们无法判断您最终需要什么。在 JavaScript 中,您可以传递字符串,也可以传递函数。如果执行传递的代码可以直接访问该函数,那么您应该传递该函数并直接调用它。如果执行传递的代码无法直接访问函数,或者不提前知道函数名称是什么,那么您传递一个字符串并使用该字符串访问window 上的属性,其中函数存储
【解决方案2】:

jsFiddle Demo

设置

首先您需要设置pleaseCallTheOtherFunction 方法,如下所示:

$.fn.pleaseCallTheOtherFunction = function(otherFunction) {
    if ($.isFunction(otherFunction)) {
        otherFunction.apply(this, ['works']);
    }
};

用法

然后您需要创建“替换”函数(委托),然后不带引号调用它,如下所示:

function callThisPlease (testIt){
    alert(testIt);
}

$(document).ready(function () {
    $().pleaseCallTheOtherFunction(callThisPlease);
});

或者

你可以写一个内联函数:

$(document).ready(function () {
    $().pleaseCallTheOtherFunction(function(testIt) {
        alert(testIt);
    });
});

【讨论】:

  • 你看到OP的pleaseCallTheOtherFunction了吗?它需要一个函数名作为字符串,作为参数。
  • 尝试传递不带引号的函数,这样你传递的是实际函数,而不是函数名。
  • 我添加了一个 JsFiddle 作为示例;希望这会有所帮助。
猜你喜欢
  • 2021-04-13
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2011-04-16
  • 2017-02-05
  • 2014-10-18
相关资源
最近更新 更多