JavaScript高频面试题

本文深入探讨JavaScript中的核心概念,包括作用域(全局、局部、块级)、this的四种情况(全局、函数、箭头函数、new关键字)、闭包的原理、作用及应用场景,以及原型、继承(原型链、构造函数、组合继承、原型式、寄生式、寄生组合继承)和执行上下文。同时介绍了函数柯里化和反柯里化的应用。
摘要由CSDN通过智能技术生成

1、作用域

作用域:即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合,作用域决定了这些变量的可访问性(可见性)。

1)全局作用域:
任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问。
2) 函数作用域:
函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问
3)块级作用域:
ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量

作用域链:
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链

2、this

1):全局上下文:
无论是否为严格模式,均指向全局对象。注意:严格模式下全局对象为undifined
2)函数上下文:
指向函数的调用对象,且是最直接的调用对象:
3)箭头函数:
由于箭头函数不绑定this, 它会捕获其所在上下文的this值, 作为自己的this
4)new关键词:
通过构建函数new关键字生成一个实例对象,此时this指向这个实例对象,如果函数return一个对象,那么this会指向到返回的对象

改变this指向:
1)call:
call() 方法调用一个函数, 其具有一个指定的 this值和参数列表
语法:函数.call(指向的对象,参数1,参数2)
call的性能要比apply好一些
2)apply:
apply()方法调用一个函数, 其具有一个指定的 this 值,以及作为一个数组
语法:语法:函数.call(指向的对象,[参数1,参数2])
3)bind:
bind() 函数会创建一个新函数,新函数与被调函数具有相同的函数体,当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。

在这里插入图片描述

3、闭包

1)什么是闭包:
闭包是指有权访问另一个函数作用域中的变量的函数
2)闭包的作用:

  1. 在外部访问函数内部的变量
  2. 让函数内的局部变量可以一直保存下去,不会被垃圾回收机制回收
  3. 模块化私有属性和公共属性

3)闭包的原理:
全局变量生存周期是永久,局部变量生存周期随着函数的调用结束而销毁,但是,闭包的情况不一样:在另一个函数内部定义的函数会将包含外部函数的活动对象添加到它的作用域链中,函数执行完毕后,其活动对象也不会被销毁,因为内部函数的作用域链仍然在引用这个活动对象。所以当函数执行完毕后,只是执行的作用域链会被销毁,但它的活动对象仍然保留在内存中,直到内部函数被销毁后才销毁。

4)闭包的优缺点
优点:
保护私有上下文中的"私有变量" 和 外界互不影响
私有上下文中的“私有变量”和“值”都会被保存起来,可以供其下级上下文中使用
缺点:
如果使用闭包,会导致栈内存太大,页面渲染变慢,性能受到影响
优化:
由于闭包会一直占用内存空间,直到页面销毁,我们可以主动将已使用的闭包销毁:
将闭包函数赋值为null 可以销毁闭包
5)闭包遇到的问题
多个子函数的[[scope]]都是同时指向父级,是完全共享的。因此当父级的变量对象被修改时,所有子函数都受到影响。
解决:
变量可以通过 函数参数的形式 传入,避免使用默认的[[scope]]向上查找
使用setTimeout包裹,通过第三个参数传入
使用 块级作用域,让变量成为自己上下文的属性,避免共享

6)闭包的应用场景
1、数组对象进行排序

let lessons = [
	{
   
		title: "Nodejs快速入门",
		click: 100,
		price: 3200
	},
	{
   
		title: "html+css",
		click: 100,
		price: 1200
	},
	{
   
		title: "js入门到精通",
		click: 2100,
		price: 2000
	}
];
function myOrder(field) {
   
	return (a, b) => a[field] - b[field];
}
lessons.sort
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值