大家好,我是海拥,专注于前端知识的分享。今天将给大家带来的是 400 个最常见的 JavaScript 面试问答第三部分。接下来我会持续更新(争取日更,也可能每周3-5篇),每小节大概 10 道题左右,总共会有 400 多道。
大家一定要记得点赞收藏呀!!!
21.什么是暂时性死区?
暂时性死区是 JavaScript 中的一种行为,在使用 let 和 const 关键字声明变量时发生,但不使用 var 声明变量。在 ECMAScript 6 中,在其声明之前(在其范围内)访问letorconst变量会导致 ReferenceError。发生这种情况的时间跨度,即变量绑定的创建和声明之间,称为时间死区。
让我们用一个例子来看看这个行为,
function somemethod() {
console.log(counter1); // undefined
console.log(counter2); // ReferenceError
var counter1 = 1;
let counter2 = 2;
}
22.什么是IIFE(立即执行函数表达式)?
IIFE(立即调用函数表达式)是一个 JavaScript 函数,它在定义后立即运行。它的签名如下,
(function ()
{
// 在这里写逻辑
}
)
();
使用 IIFE 的主要原因是为了获得数据隐私,因为在 IIFE 中声明的任何变量都不能被外界访问。即,如果您尝试使用 IIFE 访问变量,则会引发如下错误,
(function ()
{
var message = "IIFE";
console.log(message);
}
)
();
console.log(message); //Error: message is not defined(消息未定义)
23.使用模块有什么好处?
使用模块有利于扩展有很多好处。其中一些好处是,
- 可维护性
- 可重用性
- 命名空间
24.什么是memoization(记忆)?
Memoization 是一种编程技术,它试图通过缓存先前计算的结果来提高函数的性能。每次调用 memoized 函数时,都会使用其参数来索引缓存。如果数据存在,则可以返回它,而无需执行整个函数。否则执行该函数,然后将结果添加到缓存中。
让我们举一个添加记忆化功能的例子,
const memoizAddition = () => {
let cache = {};
return (value) => {
if (value in cache) {
console.log('Fetching from cache');
return cache[value]; // 在这里, cache.value 不能用作以数字开头的属性名称,该数字不是有效的 JavaScript 标识符。 因此,只能使用方括号表示法访问。
}
else {
console.log('Calculating result');
let result = value + 20;
cache[value] = result;
return result;
}
}
}
// memoizAddition 返回的函数
const addition = memoizAddition();
console.log(addition(20)); //输出: 40 calculated
console.log(addition(20)); //输出: 40 cached
25.什么是Hoisting(变量提升)?
Hoisting是一种 JavaScript 机制,其中变量和函数声明在代码执行之前被移动到其作用域的顶部。请记住,JavaScript 只提升声明,而不是初始化。
我们举一个简单的变量提升的例子,
console.log(message); //输出: undefined
var message = 'The variable Has been hoisted';
上面的代码看起来像下面的解释器,
var message;
console.log(message);
message = 'The variable Has been hoisted';
26.ES6 中的类是什么?
在 ES6 中,Javascript 类主要是对 JavaScript 现有的基于原型的继承的语法糖。
例如,在函数表达式中编写的基于原型的继承如下,
function Bike(model,color) {
this.model = model;
this.color = color;
}
Bike.prototype.getDetails = function() {
return this.model + ' bike has' + this.color + ' color';
};
而 ES6 类可以定义为替代
class Bike{
constructor(color, model) {
this.color= color;
this.model= model;
}
getDetails() {
return this.model + ' bike has' + this.color + ' color';
}
}
27.什么是closures(闭包)?
闭包是函数和声明该函数的词法环境的组合。即,它是一个内部函数,可以访问外部或封闭函数的变量。闭包有三个作用域链
- 自己的范围,其中在其大括号之间定义变量
- 外部函数的变量
- 全局变量
让我们举一个闭包概念的例子,
function Welcome(name){
var greetingInfo = function(message){
console.log(message+' '+name);
}
return greetingInfo;
}
var myFunction = Welcome('Haiyong');
myFunction('Welcome '); //输出: Welcome Haiyong
myFunction('Hello Mr.'); //输出: Hello Mr.Haiyong
根据上面的代码,即使在外部函数返回之后,内部函数(即,greetingInfo)也可以访问外部函数作用域(即 Welcome)中的变量。
28.什么是modules(模块)?
模块是指独立、可重用代码的小单元,也是许多 JavaScript 设计模式的基础。大多数 JavaScript 模块导出对象字面量、函数或构造函数
29.为什么需要模块?
以下是在 javascript 生态系统中使用模块的好处
- 可维护性
- 可重用性
- 命名空间
30.javascript中的作用域是什么?
作用域是在运行时代码的某些特定部分中变量、函数和对象的可访问性。换句话说,范围决定了代码区域中变量和其他资源的可见性。
希望大家能够给海海 点赞+收藏+关注 ,你的支持是海海更新的动力!后面我会持续分享面试经验 & 前端相关的专业知识。
最后祝大家都能找到满意的实习和 offer!