Javascript 如何执行作为参数传递给函数的方法
我想用JavaScript编写我自己的函数,它将回调方法作为参数,并在完成后执行,我不知道如何调用作为参数传递的方法中的方法。就像反射一样 示例代码Javascript 如何执行作为参数传递给函数的方法,javascript,invoke,method-invocation,Javascript,Invoke,Method Invocation,我想用JavaScript编写我自己的函数,它将回调方法作为参数,并在完成后执行,我不知道如何调用作为参数传递的方法中的方法。就像反射一样 示例代码 function myfunction(param1, callbackfunction) { //do processing here //how to invoke callbackfunction at this point? } //this is the function call to myfunction myfun
function myfunction(param1, callbackfunction)
{
//do processing here
//how to invoke callbackfunction at this point?
}
//this is the function call to myfunction
myfunction("hello", function(){
//call back method implementation here
});
您可以将其作为普通函数调用:
function myfunction(param1, callbackfunction)
{
//do processing here
callbackfunction();
}
唯一额外的事情是提到上下文。如果您希望能够在回调中使用this
关键字,则必须分配它。这通常是可取的行为。例如:
function myfunction(param1, callbackfunction)
{
//do processing here
callbackfunction.call(param1);
}
在回调中,您现在可以作为
this
访问param1
。请参阅。另一种方法是将函数声明为匿名函数并将其保存在变量中:
var aFunction = function () {
};
之后,您可以将函数作为参数myfunction传递并正常调用它
function myfunction(callbackfunction) {
callbackfunction();
}
myfunction(aFunction);
但是,正如其他答案所指出的,没有必要这样做,因为您可以直接使用函数名。由于评论中的讨论,我将保留原样的答案。我也遇到了同样的情况,我必须调用作为参数发送给另一个函数的函数 我试过了 第一种方法 但最终会出现错误。所以我试过了 第二种方法 还是没用。所以我试过了 第三种方法
就像冠军一样。所以这只是增加了一种呼叫方式。我的第一种和第二种方法可能有问题,但我更多地用谷歌搜索,花时间使用第三种方法 我会做这样的事情
var callbackfunction = function(param1, param2){
console.log(param1 + ' ' + param2)
}
myfunction = function(_function, _params){
_function(_params['firstParam'], _params['secondParam']);
}
在主代码块中,可以传递参数
myfunction(callbackfunction, {firstParam: 'hello', secondParam: 'good bye'});
这里的所有示例似乎都说明了如何声明它,但没有说明如何使用它。我想这也是@Kiran有这么多问题的原因 诀窍是声明使用回调的函数:
function doThisFirst(someParameter, myCallbackFunction) {
// Do stuff first
alert('Doing stuff...');
// Now call the function passed in
myCallbackFunction(someParameter);
}
如果不需要,可以省略someParameter
位
然后可以按如下方式使用回调:
doThisFirst(1, myOtherFunction1);
doThisFirst(2, myOtherFunction2);
function myOtherFunction1(inputParam) {
alert('myOtherFunction1: ' + inputParam);
}
function myOtherFunction2(inputParam) {
alert('myOtherFunction2: ' + inputParam);
}
请注意回调函数是如何传入和声明的,不带引号或括号
- 如果使用
doThisFirst(1,'myOtherFunction1')代码>它将失败
- 如果使用
(我知道在这种情况下没有参数输入),然后它会先调用doThisFirst(1,myOtherFunction3())
,这样你会得到意想不到的副作用myOtherFunction3
对象[函数名]()代码>
对象:指对象的名称
functionName:是一个变量,我们将使用它的值来调用函数
通过将用于引用函数名的变量放在[]内,将()放在括号外,我们可以使用该变量动态调用对象的函数。点表示法不起作用,因为它认为“functionName”是函数的实际名称,而不是“functionName”所包含的值。这让我有点疯狂,直到我看到这个网站。我很高兴stackoverflow.com基于上面的一些优秀答案和资源为我的用例提供了超基本的实现:
/** Returns the name of type member in a type-safe manner. **(UNTESTED)** e.g.:
*
* ```typescript
* nameof<Apple>(apple => apple.colour); // Returns 'colour'
* nameof<Apple>(x => x.colour); // Returns 'colour'
* ```
*/
export function nameof<T>(func?: (obj: T) => any): string {
const lambda = ' => ';
const funcStr = func.toString();
const indexOfLambda = funcStr.indexOf(lambda);
const member = funcStr.replace(funcStr.substring(0, indexOfLambda) + '.', '').replace(funcStr.substring(0, indexOfLambda) + lambda, '');
return member;
}
/**以类型安全的方式返回类型成员的名称**(未经测试)**例如:
*
*```打字脚本
*名称(苹果=>apple.color);//返回“颜色”
*名称(x=>x.color);//返回“颜色”
* ```
*/
导出函数名(func?:(obj:T)=>any):字符串{
常数lambda='=>';
常量funcStr=func.toString();
常量indexOfLambda=funcStr.indexOf(lambda);
常量成员=funcStr.replace(funcStr.substring(0,indexOfLambda)+','')。replace(funcStr.substring(0,indexOfLambda)+lambda',);
返回成员;
}
你能告诉我更多关于作用域调用的信息吗?@Ummar:“作用域”这个词用错了,@Roki所说的是调用中的这个
值是什么。您可以通过使用call
(或apply
)明确确定调用函数中的内容。不过,这与范围无关。通常的术语是“上下文”(例如,设置调用的上下文)。他有权利。默认情况下,全局函数中的执行“上下文”是窗口,但如果要更改,可以使用不同的对象调用函数。这个问题是关于myfunction
如何调用传递到其中的回调,而不是作为回调调用myfunction
。但即使是这样,也没有任何理由让这个函数匿名。您可以使用符号myfunction
以任何方式引用该函数。(并使其匿名。)好的,我已经编辑了这个问题以交换名称,我正在阅读你的文章,感谢你的指针。再说一次:你不需要将callbackfunction
函数匿名以将其用作回调。(如果你愿意,也可以,但不必如此。)你的回答仍然给人一种强烈的印象。它还使用了两个不同的callbackfunction
符号(其中一个是变量,另一个是函数参数),这让人很困惑。@T.J.Crowder我明白了你关于匿名函数的观点,不过我不打算在我的答案中改变这一点,因为已经有其他答案显示了另一种方式。它已经被否决了,所以它一直被否决,我同意。关于如何组织JavaScript类并允许私有方法的文章非常有趣。我将在我的代码中尝试它。我添加了一些注释,这是一种替代方法,并指出了注释中的讨论,因此现在应该更清楚了。如果将函数作为参数传递,如main函数(callThisFunction);而不是作为一个字符串。但无论如何,是的,你有第三种方法:)这是一种有用的技术,但它与这个问题相关吗?传递的是一个函数对象,而不是一个方法名……如果我想在调用myfunction时向回调函数传递一个参数,该怎么办?例如,myfunction(“hello”,functi
var callbackfunction = function(param1, param2){
console.log(param1 + ' ' + param2)
}
myfunction = function(_function, _params){
_function(_params['firstParam'], _params['secondParam']);
}
myfunction(callbackfunction, {firstParam: 'hello', secondParam: 'good bye'});
function doThisFirst(someParameter, myCallbackFunction) {
// Do stuff first
alert('Doing stuff...');
// Now call the function passed in
myCallbackFunction(someParameter);
}
doThisFirst(1, myOtherFunction1);
doThisFirst(2, myOtherFunction2);
function myOtherFunction1(inputParam) {
alert('myOtherFunction1: ' + inputParam);
}
function myOtherFunction2(inputParam) {
alert('myOtherFunction2: ' + inputParam);
}
/** Returns the name of type member in a type-safe manner. **(UNTESTED)** e.g.:
*
* ```typescript
* nameof<Apple>(apple => apple.colour); // Returns 'colour'
* nameof<Apple>(x => x.colour); // Returns 'colour'
* ```
*/
export function nameof<T>(func?: (obj: T) => any): string {
const lambda = ' => ';
const funcStr = func.toString();
const indexOfLambda = funcStr.indexOf(lambda);
const member = funcStr.replace(funcStr.substring(0, indexOfLambda) + '.', '').replace(funcStr.substring(0, indexOfLambda) + lambda, '');
return member;
}