JavaScript面试重点:变量提升、闭包、this与跨域

需积分: 5 0 下载量 187 浏览量 更新于2024-08-04 收藏 84KB PDF 举报
"JS面试.pdf" 在JavaScript编程中,面试常常涉及到一些核心概念和技术,如变量和函数声明的提升、闭包、`this`的指向、跨域解决方案、`let`和`const`的区别以及内存泄漏。以下是这些知识点的详细说明: 1. 变量和函数声明的提升: - JavaScript引擎在执行代码之前会先解析,将`var`声明的变量和所有函数声明提升到其所在作用域的顶部。这意味着在作用域内的任何地方声明的变量和函数都可以在它们的实际声明之前被访问。 - 函数声明的提升优先级高于变量声明。如果在函数内部用`var`再次声明一个同名外部变量,那么在该函数内部,它将覆盖外部的变量。 2. 闭包: - 闭包是一种特殊的作用域现象,允许函数访问并操作其外部作用域中的变量,即使在其外部作用域已经结束的情况下。它通常是通过在一个函数内部定义另一个函数并返回这个内部函数来实现的。 - 闭包的主要好处包括:保护变量不被外部访问(创建私有变量),保持变量状态(内存中的持久化),以及封装私有方法。 - 然而,过度使用闭包可能导致内存消耗增加,如果不妥善处理,可能会引起内存泄漏。 3. `this`: - `this`关键字总是指向调用当前函数的对象。在全局环境中,`this`指向全局对象(在浏览器中是`window`)。如果函数是通过`new`关键字调用的,`this`将指向新创建的对象。在事件处理函数中,`this`通常指向触发事件的元素。 4. 解决跨域问题: - JSONP(JSON with Padding)利用动态插入`<script>`标签实现跨域数据请求。 - 同源策略下,通过设置`document.domain`可以允许同主域名下的子域名之间进行跨域通信。 - 使用Node.js作为中间件代理,可以转发跨域请求。 - 后端服务器可以通过设置响应头的`Access-Control-Allow-Origin`来允许特定域名进行跨域请求。 5. `let`和`const`的区别: - `let`不进行变量提升,如果在声明之前使用,会导致`ReferenceError`。 - 块级作用域:`let`和`const`在块级作用域内有效,如`{}`,这与`var`不同,`var`的作用域是函数或全局。 - `let`不允许在同一作用域内重声明变量,而`const`则禁止修改变量的初始赋值。 - `const`定义的常量不能更改,但若定义的是对象,虽然对象引用不可变,但对象内部的属性是可以修改的。 6. 内存泄漏: - 内存泄漏是指程序动态分配的堆内存没有被正确释放,导致资源浪费。 - JavaScript中可能导致内存泄漏的情况包括:未释放的全局变量、DOM引用、未清除的定时器、以及子元素引用等。 7. 数组(array)方法: - `map()`:遍历数组并返回由回调函数返回值组成的新数组,不改变原数组。 - `forEach()`:遍历数组,无法中途`break`,但可以用`try/catch`抛出错误来终止。 - `filter()`:根据回调函数返回值筛选数组元素,返回新数组。 - `some()`:只要有一个元素满足条件,整体结果即为`true`。 - `every()`:所有元素都满足条件,整体结果才为`true`。 - `join(separator)`:将数组元素用指定分隔符连接成字符串。 - `push()`/`pop()`:在数组末尾添加/移除元素,改变原数组。 - `unshift()`/`shift()`:在数组开头添加/移除元素,改变原数组。 - `sort()`/`reverse()`:对数组进行排序/反转,改变原数组。 - `concat()`:连接多个数组,不改变原数组,是浅拷贝。 - `slice(start, end)`:截取数组的一部分并返回新数组,不改变原数组。 - `splice(start, number, value...)`:删除指定范围的元素,并可插入新元素,改变原数组。 - `indexOf()`/`lastIndexOf()`:查找元素首次出现/最后一次出现的索引。 理解并掌握这些基本概念对于JavaScript开发者来说至关重要,尤其是在面试中,这些都是评估开发者技能的关键点。