Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在C中动态更改函数_Javascript_C_Function - Fatal编程技术网

Javascript 在C中动态更改函数

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

我想知道C中是否有与此javascript代码等价的代码(对于
void
函数):

var myFunction;
myFunction = function(){
    //Some code
}

如果要更改某个函数调用的行为,可以对函数指针进行操作,而不是直接调用函数:

  • 带有对()的引用的Init函数指针fp1
  • 呼叫fp1
  • 用对b()的引用覆盖函数指针
  • 呼叫fp1

如果要更改某个函数调用的行为,可以对函数指针进行操作,而不是直接调用函数:

  • 带有对()的引用的Init函数指针fp1
  • 呼叫fp1
  • 用对b()的引用覆盖函数指针
  • 呼叫fp1
不是真正等价的(因为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是一种静态语言,不支持匿名或嵌套函数),但您可以使用一个指向函数的指针的变量,并使其指向与变量类型匹配的不同编译函数

非常简单和基本的示例:

#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。不过,对于变量函数,函数必须接受变量参数,因此您在编译时就知道了。