将 JavaScript 源文件的全部内容包装在立即调用的函数中的原因是什么?
这种技术在 JavaScript 库中很常见。它围绕文件的全部内容创建了一个闭包,从而创建了一个私有命名空间,从而有助于避免不同 JavaScript 模块和库之间潜在的名称冲突。立即调用该函数,以便为命名空间(库名称)分配函数的返回值。
const myLibrary = (function() {
var privateVariable = 2
return {
publicMethod: () => privateVariable
}
})()
privateVariable // ReferenceError
myLibrary.publicMethod() // 2
JavaScript 中唯一不等于自身的值是什么?
NaN
(Not-a-Number) 是与任何比较运算符进行比较时唯一不等于自身的值。NaN
通常是无意义的数学计算的结果,因此将两个NaN
值视为相等是没有意义的。
什么是递归,什么时候有用?
递归是一个过程的重复应用。在 JavaScript 中,递归涉及重复调用自身直到达到基本条件的函数。基本条件跳出递归循环,否则函数将无限期地调用自身。当处理包含嵌套层数未知的数据结构时,递归非常有用。
例如,您可能有一个从数据库返回的评论线程,这些评论存在于平面数组中,但需要嵌套以在 UI 中显示。每个评论要么是顶级评论(无父评论),要么是对父评论的回复。评论可以是回复的回复……我们事先不知道评论的深度可能是多少。这就是递归可以提供帮助的地方。
const nest = (items, id = null, link = "parent_id") =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }))
const comments = [
{ id: 1, parent_id: null, text: "First reply to post." },
{ id: 2, parent_id: 1, text: "First reply to comment #1." },
{ id: 3, parent_id: 1, text: "Second reply to comment #1." },
{ id: 4, parent_id: 3, text: "First reply to comment #3." },
{ id: 5, parent_id: 4, text: "First reply to comment #4." },
{ id: 6, parent_id: null, text: "Second reply to post." }
]
nest(comments)
/*
[
{ id: 1, parent_id: null, text: "First reply to post.", children: [...] },
{ id: 6, parent_id: null, text: "Second reply to post.", children: [] }
]
*/
在上面的示例中,如果filter()
返回一个空数组,则满足基本条件。被链接map()
的不会调用包含递归调用的回调函数,从而打破循环。