我试过在专业论坛上问这个,没有人为我解答这个问题,但是我希望有人在这里。下面是有问题的代码片段,除了2位之外,我知道它是如何工作的。
this.data = allItems().filter(function(item) {
return this.includes(item);
}, this);
如上所述,我理解上面代码的两个部分:这种类型的函数被称为什么?回电话?没有名为" item"或主函数中的变量名为" item"。最后,为什么"这个"片段的一部分?
很抱歉,如果这些信息不够充分,我会尽量对这个问题尽可能透彻,因为我不熟悉这种脚本风格。我已经对这个主题做了一些研究,我能得到的最接近的解释是私有函数,但正如我上面提到的,没有一个函数称为" item"任何地方。
答案 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
可确保变量me
和you
将我们标记为个人。这样,即使我们都可以有共同点,但我们知道我们并不相同。它还使您可以在以后检查该信息。如果没有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);
this.data
说“这个代码来自的函数调用的this
实例上的数据变量”等于allItems()
,它可能会返回一个项目数组,被过滤掉一个功能。由于Javascript允许称为“匿名”函数,即没有名称的函数,我们创建一个匿名函数(非命名函数),它接受item
的命名参数。 filter
方法的函数将返回includes
方法的结果(很可能是在代码中的某个地方定义的),这是传递给我们的值来自第1行的参数item
。}
结束功能定义。下一部分回到我之前所说的,this
指的是当前的函数调用,除非指示它不要。 , this);
是程序员说“在这个函数上,我在上面声明,我希望this
引用我当前使用的对象。”这部分很棘手,如果你不完全确定不要过多担心它,肯定需要一些时间来理解。
希望这有帮助。
答案 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