Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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中的(函数(func){func();}_Javascript_Anonymous Function - Fatal编程技术网

试图理解JavaScript中的(函数(func){func();}

试图理解JavaScript中的(函数(func){func();},javascript,anonymous-function,Javascript,Anonymous Function,来自C,每个函数都需要一个用于调用特定函数的名称。但是在下面的JavaScript代码中,根本没有名称。那么function(func){func();}如何调用something.push(function() 更不用说,something.push(function()甚至没有参数,从C的角度来看,这是错误的 var something = [], object = { a: true, b: true, c: true } for (let key in

来自C,每个函数都需要一个用于调用特定函数的名称。但是在下面的JavaScript代码中,根本没有名称。那么
function(func){func();}
如何调用
something.push(function()

更不用说,
something.push(function()
甚至没有参数,从C的角度来看,这是错误的

var something = [], 
  object = {
    a: true,
    b: true,
    c: true
}

 for (let key in object){
   something.push(function() {
   console.log(key);
   });
 }

 something.forEach(function(func) { func(); }): 

JavaScript比C更抽象。在JavaScript中,解释器在内部保存每个变量的类型和指针。当您声明一个函数时,它在内部保存在内存中的某个位置,并且该函数的指针将传递给您传递给它的任何对象(此处为
something.forEach


但是,这不像C中的指针,您不能访问它的值(函数地址),也不能更改它。简单地说,当您尝试调用某个对象时,解释程序引擎将检查其类型。如果其类型是函数,线程将做一些准备,然后执行跳转到函数指针所指向的内存位置。

JavaScript比C更抽象。在JavaScript中,解释程序内部保存有各种类型和指针y变量。当您声明一个函数时,它会内部保存在内存中的某个位置,并且该函数的指针将传递给您传递给它的任何对象(这里是传递给
something.forEach


但是,这不像C中的指针,您不能访问它的值(函数地址),也不能更改它。简单地说,当您尝试调用某个函数时,解释器引擎将检查其类型。如果其类型是函数,线程将做一些准备,然后执行跳转到函数指针指向的内存位置。

something数组正在存储对函数的引用,但不调用它们。在
forEach
循环,数组中的每个函数都被调用

公平地说,命名是令人困惑的。你也可以简单地写:

something.forEach(function(storedFunction) { storedFunction(); }):

由于它是一个临时变量,
something
数组存储对函数的引用,但不调用它们。在
forEach
循环中,数组中的每个函数都被调用

公平地说,命名是令人困惑的。你也可以简单地写:

something.forEach(function(storedFunction) { storedFunction(); }):

因为它是一个临时变量

,所以这里发生的事情是在循环中,我们是一个函数,在每次迭代中对某个东西,假设某个东西是一个数组

然后,我们调用集合的函数。此函数中的第一个参数始终是我们正在迭代的当前项。在本例中,我们正在迭代我们在循环中构建的函数列表。由于这些函数是函数,我们可以调用它们,这就是每个函数的情况

以下是一个有助于说明的示例:

// declare some functions
function a(){console.log('hi');}
function b(){console.log('there');}
function c(){console.log('friend');}
const ar = [];

// push the functions to the array
ar.push(a);
ar.push(b);
ar.push(c);
ar.push(a);

ar.forEach(function(func) {func();});

// console output:
// hi
// there
// friend
// hi

编辑:我强烈建议你阅读。如果你去那里仔细阅读,我想你会对这个概念有一个非常坚实的理解。

因此,这里发生的事情是循环中的,我们是一个
函数,在每次迭代中
某物
。假设
某物
是一个数组

然后,我们调用集合的函数。此函数中的第一个参数始终是我们正在迭代的当前项。在本例中,我们正在迭代我们在循环中构建的函数列表。由于这些函数是函数,我们可以调用它们,这就是每个函数的情况

以下是一个有助于说明的示例:

// declare some functions
function a(){console.log('hi');}
function b(){console.log('there');}
function c(){console.log('friend');}
const ar = [];

// push the functions to the array
ar.push(a);
ar.push(b);
ar.push(c);
ar.push(a);

ar.forEach(function(func) {func();});

// console output:
// hi
// there
// friend
// hi

编辑:我强烈建议您阅读。如果您去那里仔细阅读,我认为您将对这一概念有一个非常坚实的理解。

在JavaScript中,函数被视为对象。在C中,您必须意识到并非每个对象(值)都需要有名称,或者不需要存储在变量中。就像您可以​
sum(4,5);
.4和5是不存储在变量中的值


要回答您关于在没有名称的情况下如何调用它们的问题,函数将作为参数传递给push函数。在这里,形式参数必须有一些名称。因此可以使用该名称调用它。在这种情况下,push不调用它,而是将其存储在一个数组中,以便稍后调用。可以通过索引到数组中来调用它

在JavaScript中,函数被视为对象。在C中,您必须知道并非每个对象(值)都需要有名称,或者不需要存储在变量中。就像您可以有​
sum(4,5);
.4和5是不存储在变量中的值


要回答您关于在没有名称的情况下如何调用它们的问题,函数将作为参数传递给push函数。在这里,形式参数必须有一些名称。因此可以使用该名称调用它。在这种情况下,push不调用它,而是将其存储在一个数组中,以便稍后调用。可以通过索引到数组中来调用它

您看到的是匿名函数和闭包的使用,简而言之,这是一个非常好的Javascript

在这里,我描述了每个块的代码块:

我们创建一个数组(如C中所示):

var something = [], 
something.push(function() {
我们创建一个对象(它是key=value的集合)

我们迭代对象的元素对象

节目就在那里:

var something = [], 
something.push(function() {
每个对象都有一个push函数,允许动态地将元素放入其中。 您在这里看到的是一个匿名函数被用作参数;这意味着对于这个push函数的每次执行,一个函数执行以下操作:

console.log(key);
将被放入数组中

之后,唯一要做的就是使用func()进行
回调

这意味着对于某事物的每个元素,您都将其视为函数
let xs = [1,2,3]
let y = x => 2 * x
xs.map(y)
// [2,4,6]
let add = x => {
  return y => x + y
}
let f = add(1)
f(2)
// 3
let pikachu = {
  number: 25,
  shock: enemy => enemy.damage(30),
  growl: enemy => enemy.sadden(40)
}
pikachu.growl(meowth)
// "It's very effective!"