函数创建作为参数?

时间:2016-05-05 04:07:23

标签: javascript function

我试过在专业论坛上问这个,没有人为我解答这个问题,但是我希望有人在这里。下面是有问题的代码片段,除了2位之外,我知道它是如何工作的。

this.data = allItems().filter(function(item) {
    return this.includes(item);
}, this);

如上所述,我理解上面代码的两个部分:这种类型的函数被称为什么?回电话?没有名为" item"或主函数中的变量名为" item"。最后,为什么"这个"片段的一部分?

很抱歉,如果这些信息不够充分,我会尽量对这个问题尽可能透彻,因为我不熟悉这种脚本风格。我已经对这个主题做了一些研究,我能得到的最接近的解释是私有函数,但正如我上面提到的,没有一个函数称为" item"任何地方。

3 个答案:

答案 0 :(得分:2)

Javascript是一种奇怪的语言。对于我们这些先学习编译编程语言的人来说,它分享了视觉审美,但幕后花絮却非常不同。首先要理解的是,在javascript中,每个函数都作为一个特殊的引用称为this。它引用了函数的当前迭代。

可以这样想:有一个名为Human的类,它定义了一组所有人共有的属性 - 我们有身高和体重,名字,眼睛颜色,头发颜色等。但是我,5英尺8英寸,200磅,淡褐色眼睛和秃头与你或任何其他人的描述不一样。虽然肯定会有另外一个具有这些特征的人,但我们并不相同。

var Human = function(name, height, weight, eye_color) {
  this.name = name;
  this.height = height;
  this.weight = weight;
  this.eye_color = eye_color;
}

var me = new Human('Jhecht', '5.8', 200, 'hazel');
alert(me.name); //Alerts 'Jhecht'
var you = new Human('Gatene', '6.0', 190, 'brown');
alert(you.name); //Alerts 'Gatene'

代码中的this可确保变量meyou将我们标记为个人。这样,即使我们都可以有共同点,但我们知道我们并不相同。它还使您可以在以后检查该信息。如果没有this我只会将每个变量设置为等于它自己(name=name),这会让我 无法 以后查看其内容。如果我删除this.name并将其替换为name,如果我尝试调用alert(me.name)(我很可能会得到一个未定义的值),我就不会再得到预期的结果了HTML元素的事件侦听器this将引用HTML元素,除非您另有说明。

javascript中的函数也不像其他语言中的函数那么严格(我觉得这不是正确的单词,但它是我得到的最好的单词)。请注意,在上面的代码中,我设置了我的函数:

var Human = function(name, height, weight, eye_color) ...

我本可以像这样创建这个函数:

function Human(name, height, weight, eye_color)...

结果会是一样的。

因此,在您的代码段中,让我们逐行浏览。

this.data = allItems().filter(function(item) {
    return this.includes(item);
}, this);
  1. this.data说“这个代码来自的函数调用的this实例上的数据变量”等于allItems(),它可能会返回一个项目数组,被过滤掉一个功能。由于Javascript允许称为“匿名”函数,即没有名称的函数,我们创建一个匿名函数(非命名函数),它接受item的命名参数。
  2. 传递给第1行中的。filter方法的函数将返回includes方法的结果(很可能是在代码中的某个地方定义的),这是传递给我们的值来自第1行的参数item
  3. 使用}结束功能定义。下一部分回到我之前所说的,this指的是当前的函数调用,除非指示它不要。 , this);是程序员说“在这个函数上,我在上面声明,我希望this引用我当前使用的对象。”
  4. 这部分很棘手,如果你不完全确定不要过多担心它,肯定需要一些时间来理解。

    希望这有帮助。

答案 1 :(得分:1)

filter函数接受参数。预计该参数将是具有至少1个参数(item

的函数

您的代码段正在传递一个匿名函数作为此参数:

function(item) {
    return this.includes(item);
}

因此满足了filter功能

的期望

答案 2 :(得分:1)

  

这种类型的函数叫什么?回电话?

这是一个匿名函数(因为它没有名称),它作为参数传递给filter,是的,它可以被称为回调。

  

在主函数中没有名为“item”的函数或称为“item”的变量。

你误解了基本的函数语法。 function(item)并未引用任何称为item的函数或函数。它定义了一个匿名函数,item作为其唯一的形式参数。

  

最后,为什么“this”是片段的一部分?

阅读filter的文档,特别是thisArg参数,第二个参数,它指定在调用回调函数时用作this的值。在这种情况下,指定了this,它是周围上下文的this,它是保存属性data的同一对象,以及称为{{的方法1}}。

使用箭头函数,不使用includes参数可以更容易地编写,如

thisArg