试图理解JavaScript中的(函数(func){func();}
来自C,每个函数都需要一个用于调用特定函数的名称。但是在下面的JavaScript代码中,根本没有名称。那么试图理解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
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!"