大家好,我是海擁,專注於前端知識的分享。今天將給大家帶來的是 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!