Javascript 在C中动态更改函数
我想知道C中是否有与此javascript代码等价的代码(对于Javascript 在C中动态更改函数,javascript,c,function,Javascript,C,Function,我想知道C中是否有与此javascript代码等价的代码(对于void函数): var myFunction; myFunction = function(){ //Some code } 如果要更改某个函数调用的行为,可以对函数指针进行操作,而不是直接调用函数: 带有对()的引用的Init函数指针fp1 呼叫fp1 用对b()的引用覆盖函数指针 呼叫fp1 如果要更改某个函数调用的行为,可以对函数指针进行操作,而不是直接调用函数: 带有对()的引用的Init函数指针fp1 呼叫f
void
函数):
var myFunction;
myFunction = function(){
//Some code
}
如果要更改某个函数调用的行为,可以对函数指针进行操作,而不是直接调用函数:
- 带有对()的引用的Init函数指针fp1
- 呼叫fp1
- 用对b()的引用覆盖函数指针
- 呼叫fp1
- 带有对()的引用的Init函数指针fp1
- 呼叫fp1
- 用对b()的引用覆盖函数指针
- 呼叫fp1
#include <stdio.h>
void function1(void)
{
printf("function1\n");
}
void function2(void)
{
printf("function2\n");
}
int main(void)
{
// Declare a variable that is a pointer to a function taking no arguments
// and returning nothing
void (*ptr_to_fun)(void);
ptr_to_fun = &function2;
ptr_to_fun();
ptr_to_fun = &function1;
ptr_to_fun();
return 0;
}
#包括
无效功能1(无效)
{
printf(“函数1\n”);
}
无效功能2(无效)
{
printf(“函数2\n”);
}
内部主(空)
{
//声明一个变量,该变量是指向不带参数的函数的指针
//什么也不还
无效(*ptr_to_fun)(无效);
ptr_to_fun=&function2;
ptr_to_fun();
ptr_to_fun=&function1;
ptr_to_fun();
返回0;
}
以上程序将打印出来
function2
function1
功能2
功能1
不是真正等价的(因为C是一种静态语言,不支持匿名或嵌套函数),但您可以使用一个指向函数的指针的变量,并使其指向与变量类型匹配的不同编译函数
非常简单和基本的示例:
#include <stdio.h>
void function1(void)
{
printf("function1\n");
}
void function2(void)
{
printf("function2\n");
}
int main(void)
{
// Declare a variable that is a pointer to a function taking no arguments
// and returning nothing
void (*ptr_to_fun)(void);
ptr_to_fun = &function2;
ptr_to_fun();
ptr_to_fun = &function1;
ptr_to_fun();
return 0;
}
#包括
无效功能1(无效)
{
printf(“函数1\n”);
}
无效功能2(无效)
{
printf(“函数2\n”);
}
内部主(空)
{
//声明一个变量,该变量是指向不带参数的函数的指针
//什么也不还
无效(*ptr_to_fun)(无效);
ptr_to_fun=&function2;
ptr_to_fun();
ptr_to_fun=&function1;
ptr_to_fun();
返回0;
}
以上程序将打印出来
function2
function1
功能2
功能1
在C语言中,可以使用函数指针:
void the_function(void) {
// ...
}
void (*my_function)(void) = the_function;
C不支持匿名函数,因此函数本身需要有一个名称(这里我使用的是函数
)
通过函数指针调用函数,就像调用普通函数一样:
my_function();
然而,这种做法受到限制。首先,您必须知道函数需要的参数的数量和类型。用错误的参数调用它将调用未定义的行为。此外,您还需要知道返回值的实际类型。这些需要在编译时知道。您需要使用来调用在运行时不知道其签名的函数。在C中,您可以使用函数指针:
void the_function(void) {
// ...
}
void (*my_function)(void) = the_function;
C不支持匿名函数,因此函数本身需要有一个名称(这里我使用的是函数
)
通过函数指针调用函数,就像调用普通函数一样:
my_function();
然而,这种做法受到限制。首先,您必须知道函数需要的参数的数量和类型。用错误的参数调用它将调用未定义的行为。此外,您还需要知道返回值的实际类型。这些需要在编译时知道。您需要使用来调用在运行时不知道其签名的函数。不知道javascript,但它似乎与cNot中的函数指针类似。匿名函数远不止这些。它们可以捕获自己的上下文(也就是说,它们可以当场定义——如上所述),并且可以捕获定义它们的(外部)函数的局部变量。我不知道javascript,但它似乎与cNot中的函数指针非常相似。匿名函数远不止这些。它们可以捕获它们的上下文(也就是说,它们可以当场定义——如上所述),并且可以捕获定义它们的(外部)函数的局部变量。事实上,这并不等同,因为这不能内联(在另一个函数内)定义。匿名函数甚至可以捕获外部函数的局部变量,等等。FWIW、Delphi也是一种静态语言,但它可以实现匿名函数。真正的问题是C是一种过程语言而不是OO语言+无论如何,这不是真正等价的,因为它不能内联定义(在另一个函数中)。匿名函数甚至可以捕获外部函数的局部变量,等等。FWIW、Delphi也是一种静态语言,但它可以实现匿名函数。真正的问题是C是一种过程语言而不是OO语言+1。如果要使用可变数量的参数,可以向其传递数组和元素数。可以使用变量函数(a la printf())来获取可变参数列表。@FlorianCastellane true。不过,对于变量函数,函数必须接受变量参数,因此您在编译时就知道了。如果要使用变量数量的参数,可以向它传递数组和元素数量。可以使用变量函数(a la printf())来获取可变参数列表。@FlorianCastellane true。不过,对于变量函数,函数必须接受变量参数,因此您在编译时就知道了。