400個最常見的 JavaScript 面試問答(3)

海擁科技 發佈 2022-08-06T15:51:28.398671+00:00

暫時性死區是 JavaScript 中的一種行為,在使用 let 和 const 關鍵字聲明變量時發生,但不使用 var 聲明變量。

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

關鍵字: