gpt4 book ai didi

javascript - 试图理解(function(func){func();}在JavaScript中

转载 作者:行者123 更新时间:2023-12-01 03:51:51 26 4
gpt4 key购买 nike

来自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(); }):

最佳答案

来自C的每个函数都需要一个用于调用该特定函数的名称。但在下面的JavaScript代码中,根本没有名称。


在JavaScript中,事实并非如此-函数确实可以是匿名(无名)函数。有时您会听到它们被称为“ lambda”或多余的“ lambda函数”。

但更重要的是,函数是JavaScript中的一流数据成员,这意味着:


可以将它们分配给变量

let y = x => x + 5
y(3)
// 8

它们可以作为参数传递给其他函数

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!"



那么,这里能带走什么呢?嗯,在JavaScript中,您需要认为函数与任何其他值(例如 1"foo"[{user: 'bob'}, {user: 'alice'}])没有什么不同–从概念上讲,它们只是数据,而且都是一流的。



如何理解你的代码

这是我对代码的重新格式化。自从您最初询问ES6以来,我将用ES6 arrow functions代替您的lambda



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

for (let key in object) {
something.push(() => console.log(key))
}

something.forEach(func => func())
// a
// b
// c





使用高级描述符,此代码的本质是


遍历 object的每个键,向 something添加一些值
遍历 something的每个值,使用该值做某事


就您而言,某些值是一个函数,但我想向您展示如果我们使用另一种值,您的代码将是什么样子



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

for (let key in object) {
// this time push a string, instead of an anonymous function
something.push("the key is: " + key)
}

something.forEach(str => console.log(str))
// the key is: a
// the key is: b
// the key is: c





因此,现在我们可以看到使用其他值类型(字符串)时代码如何工作。除了使用字符串,我们所做的唯一另一件事就是更改

// from
func => func()

// to
str => console.log(str)


这里的理由是


在您的原始代码中, something是一个函数数组,因此对于每个函数 func,我们将其称为 func()
在修改后的代码中, something是一个字符串数组,因此对于每个字符串 str,我们将其称为 console.log(str)




剖析Array.prototype.forEach

剩下的最后一点要了解的是超级功能 forEach功能。记住第一类功能中的第二点:第一类数据成员可以作为参数传递给其他函数。

forEach期望其参数为函数。因此 forEach是一个接受另一个功能的功能。这种功能称为 higher-order function

不要让这些花哨的名字分散您的内在朴素。制作像 forEach这样的高阶函数实际上非常容易。始终记住函数与其他任何值一样–在下面,我们将编写自己的 forEach版本,以便您了解其工作原理



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

// forEach accepts an array and some function, f
let forEach = (arr, f) => {
// iterate thru each value of arr
for (let value of arr) {
// call f on each value
f(value)
}
}

for (let key in object) {
something.push("the key is: " + key)
}

forEach(something, str => console.log(str))
// the key is: a
// the key is: b
// the key is: c





现在,我们看到字符串数组与我们自己的 forEach函数一起工作。让我们确保它也可以与原始lambda数组一起使用。



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

let forEach = (arr, f) => {
for (let value of arr) {
f(value)
}
}

for (let key in object) {
something.push(() => console.log(key))
}

forEach(something, func => { func() })
// a
// b
// c







备注

就是这样!函数不是JavaScript中的特殊雪花。它们就像所有基准一样。

从C的角度来看,以这种方式考虑功能可能需要一段时间。但是,实际上,当您走进任何新编程语言的家时,应该把对任何一种语言的了解都留在门外。每种语言都有自己的表达方式,产生了一套独特的优点和缺点。通过将某种语言A的“优势”引入另一种语言B,您可能会用B自身的优势代替其自身的劣势。

JavaScript是一种多范式语言,因此非常适合命令式,面向对象和函数式编程样式。由于具有千篇一律的特性,它可能不是最佳的oop或fp语言,但是它可以以多种方式表达特定问题的解决方案仍然令人印象深刻。

关于javascript - 试图理解(function(func){func();}在JavaScript中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com