前端面试热点:JavaScript作用域、原型链与闭包解析

1星 需积分: 50 9 下载量 4 浏览量 更新于2024-09-04 1 收藏 877B TXT 举报
"本资源是一份前端面试题集,主要涉及JavaScript的基础概念,包括作用域、原型、原型链、闭包、上下文环境、DOM和BOM操作,以及封装函数和深度克隆等。同时,题目中还包含了关于JavaScript变量作用域、对象实例属性优先级及动态特性的问题。" 以下是针对题目内容的详细解释: (1)在这个HTML结构中,我们通过`getElementsByTagName('li')`获取了所有`li`元素,并为它们的`onclick`事件绑定了一个函数,该函数会弹出变量`i`的值。然而,由于JavaScript的作用域机制,这里的`i`是函数外部的变量,当点击时,`i`的值已经是循环结束后的`length`,即4。因此,无论点击哪个`li`元素,都会弹出4。 (2)这段代码检查`window`对象上是否已经有一个名为`a`的属性。如果没有,它会创建一个全局变量`a`并赋值为1。由于在`window`对象上没有`a`属性,所以`a`被初始化为1。然后,`alert(a)`会弹出1,因为全局变量`a`已被定义。 (3)这部分代码涉及到JavaScript的原型链和构造函数。首先,我们有三个构造函数`A`、`B`和`C`。`A`和`B`的原型上都有一个`a`属性,值为1,而`C`的原型上的`a`属性默认是未定义的,但当传入参数`a`时,`C`会创建一个实例属性`a`。当我们创建新的对象实例并打印`a`属性时: - `new A().a`:由于实例没有自己的`a`属性,它会向上查找原型链,找到`A.prototype`上的`a`,输出1。 - `new B().a`:同理,`B`的实例也没有自己的`a`属性,所以它也会在原型链上找到`B.prototype`的`a`,输出1。 - `new C(2).a`:`C`的构造函数接收到参数`2`,所以创建了一个实例属性`a`,其值为2,而不是查找原型链,因此输出2。 总结,这道题目考察了JavaScript中的基础概念,如作用域、原型链、构造函数以及变量和属性的查找规则。对于前端开发者来说,深入理解这些概念至关重要,因为它们构成了JavaScript语言的核心。