自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

八個(gè)針對(duì)高級(jí)職位的高級(jí) JavaScript 面試題

開(kāi)發(fā) 前端
在今天這篇文章中,我們將會(huì)看到一些重要的 JavaScript 面試問(wèn)題的深入解釋。我的目標(biāo)是徹底解釋這些面試問(wèn)題,以便我們能夠理解基本概念,并希望在面試中解決其他類(lèi)似問(wèn)題。

JavaScript 是一種功能強(qiáng)大的語(yǔ)言,是網(wǎng)絡(luò)的主要構(gòu)建塊之一。這種強(qiáng)大的語(yǔ)言也有一些怪癖。例如,您是否知道 0 === -0 的計(jì)算結(jié)果為 true,或者 Number("") 的結(jié)果為 0?

問(wèn)題是,有時(shí)這些怪癖會(huì)讓你摸不著頭腦,甚至質(zhì)疑 Brendon Eich 發(fā)明 JavaScript 的那一天。好吧,重點(diǎn)不在于 JavaScript 是一種糟糕的編程語(yǔ)言,或者像它的批評(píng)者所說(shuō)的那樣它是邪惡的。所有編程語(yǔ)言都有某種與之相關(guān)的奇怪之處,JavaScript 也不例外。

因此,在今天這篇文章中,我們將會(huì)看到一些重要的 JavaScript 面試問(wèn)題的深入解釋。我的目標(biāo)是徹底解釋這些面試問(wèn)題,以便我們能夠理解基本概念,并希望在面試中解決其他類(lèi)似問(wèn)題。

1、仔細(xì)觀察 + 和 - 運(yùn)算符

console.log(1 + '1' - 1);

您能猜出 JavaScript 的 + 和 - 運(yùn)算符在上述情況下的行為嗎?

當(dāng) JavaScript 遇到 1 + '1' 時(shí),它會(huì)使用 + 運(yùn)算符處理表達(dá)式。+ 運(yùn)算符的一個(gè)有趣的屬性是,當(dāng)操作數(shù)之一是字符串時(shí),它更喜歡字符串連接。在我們的例子中,“1”是一個(gè)字符串,因此 JavaScript 隱式地將數(shù)值 1 強(qiáng)制轉(zhuǎn)換為字符串。因此,1 + '1' 變?yōu)?'1' + '1',結(jié)果是字符串 '11'。

現(xiàn)在,我們的等式是 '11' - 1。- 運(yùn)算符的行為恰恰相反。無(wú)論操作數(shù)的類(lèi)型如何,它都會(huì)優(yōu)先考慮數(shù)字減法。當(dāng)操作數(shù)不是數(shù)字類(lèi)型時(shí),JavaScript 會(huì)執(zhí)行隱式強(qiáng)制轉(zhuǎn)換,將其轉(zhuǎn)換為數(shù)字。在本例中,“11”被轉(zhuǎn)換為數(shù)值 11,并且表達(dá)式簡(jiǎn)化為 11 - 1。

把它們放在一起:

'11' - 1 = 11 - 1 = 10

2、復(fù)制數(shù)組元素

考慮以下 JavaScript 代碼并嘗試查找此代碼中的任何問(wèn)題:

function duplicate(array) {
  for (var i = 0; i < array.length; i++) {
    array.push(array[i]);
  }
  return array;
}


const arr = [1, 2, 3];
const newArr = duplicate(arr);
console.log(newArr);

在此代碼片段中,我們需要?jiǎng)?chuàng)建一個(gè)包含輸入數(shù)組的重復(fù)元素的新數(shù)組。初步檢查后,代碼似乎通過(guò)復(fù)制原始數(shù)組 arr 中的每個(gè)元素來(lái)創(chuàng)建一個(gè)新數(shù)組 newArr。然而,重復(fù)函數(shù)本身出現(xiàn)了一個(gè)關(guān)鍵問(wèn)題。

重復(fù)函數(shù)使用循環(huán)來(lái)遍歷給定數(shù)組中的每個(gè)項(xiàng)目。但在循環(huán)內(nèi)部,它使用 push() 方法在數(shù)組末尾添加一個(gè)新元素。這使得數(shù)組每次都變得更長(zhǎng),從而產(chǎn)生循環(huán)永遠(yuǎn)不會(huì)停止的問(wèn)題。循環(huán)條件 (i < array.length) 始終保持為 true,因?yàn)閿?shù)組不斷變大。這使得循環(huán)永遠(yuǎn)持續(xù)下去,導(dǎo)致程序卡住。

為了解決數(shù)組長(zhǎng)度不斷增長(zhǎng)導(dǎo)致無(wú)限循環(huán)的問(wèn)題,可以在進(jìn)入循環(huán)之前將數(shù)組的初始長(zhǎng)度存儲(chǔ)在變量中。

然后,您可以使用該初始長(zhǎng)度作為循環(huán)迭代的限制。這樣,循環(huán)將僅針對(duì)數(shù)組中的原始元素運(yùn)行,并且不會(huì)因添加重復(fù)項(xiàng)而受到數(shù)組增長(zhǎng)的影響。這是代碼的修改版本:

function duplicate(array) {
  var initialLength = array.length; // Store the initial length
  for (var i = 0; i < initialLength; i++) {
    array.push(array[i]); // Push a duplicate of each element
  }
  return array;
}


const arr = [1, 2, 3];
const newArr = duplicate(arr);
console.log(newArr);

輸出將顯示數(shù)組末尾的重復(fù)元素,并且循環(huán)不會(huì)導(dǎo)致無(wú)限循環(huán):

[1, 2, 3, 1, 2, 3]

3、原型和__proto__之間的區(qū)別

原型屬性是與 JavaScript 中的構(gòu)造函數(shù)相關(guān)的屬性。構(gòu)造函數(shù)用于在 JavaScript 中創(chuàng)建對(duì)象。定義構(gòu)造函數(shù)時(shí),還可以將屬性和方法附加到其原型屬性。

然后,從該構(gòu)造函數(shù)創(chuàng)建的對(duì)象的所有實(shí)例都可以訪問(wèn)這些屬性和方法。因此,prototype 屬性充當(dāng)在實(shí)例之間共享的方法和屬性的公共存儲(chǔ)庫(kù)。

考慮以下代碼片段:

// Constructor function
function Person(name) {
  this.name = name;
}


// Adding a method to the prototype
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}.`);
};


// Creating instances
const person1 = new Person("Haider Wain");
const person2 = new Person("Omer Asif");


// Calling the shared method
person1.sayHello();  // Output: Hello, my name is Haider Wain.
person2.sayHello();  // Output: Hello, my name is Omer Asif.

在此示例中,我們有一個(gè)名為 Person 的構(gòu)造函數(shù)。通過(guò)使用 sayHello 之類(lèi)的方法擴(kuò)展 Person.prototype,我們將此方法添加到所有 Person 實(shí)例的原型鏈中。這允許 Person 的每個(gè)實(shí)例訪問(wèn)和利用共享方法。而不是每個(gè)實(shí)例都有自己的方法副本。

另一方面, __proto__ 屬性(通常發(fā)音為“dunder proto”)存在于每個(gè) JavaScript 對(duì)象中。在 JavaScript 中,除了原始類(lèi)型之外,所有東西都可以被視為對(duì)象。這些對(duì)象中的每一個(gè)都有一個(gè)原型,用作對(duì)另一個(gè)對(duì)象的引用。__proto__ 屬性只是對(duì)此原型對(duì)象的引用。當(dāng)原始對(duì)象不具備屬性和方法時(shí),原型對(duì)象用作屬性和方法的后備源。默認(rèn)情況下,當(dāng)您創(chuàng)建對(duì)象時(shí),其原型設(shè)置為 Object.prototype。

當(dāng)您嘗試訪問(wèn)對(duì)象的屬性或方法時(shí),JavaScript 會(huì)遵循查找過(guò)程來(lái)查找它。這個(gè)過(guò)程涉及兩個(gè)主要步驟:

對(duì)象自己的屬性:JavaScript 首先檢查對(duì)象本身是否直接擁有所需的屬性或方法。如果在對(duì)象中找到該屬性,則直接訪問(wèn)和使用它。

原型鏈查找:如果在對(duì)象本身中找不到該屬性,JavaScript 將查看該對(duì)象的原型(由 __proto__ 屬性引用)并在那里搜索該屬性。此過(guò)程在原型鏈上遞歸地繼續(xù),直到找到屬性或查找到達(dá) Object.prototype。

如果即使在 Object.prototype 中也找不到該屬性,JavaScript 將返回 undefined,表明該屬性不存在。

4、范圍

編寫(xiě) JavaScript 代碼時(shí),理解作用域的概念很重要。范圍是指代碼不同部分中變量的可訪問(wèn)性或可見(jiàn)性。在繼續(xù)該示例之前,如果您不熟悉提升以及 JavaScript 代碼的執(zhí)行方式,可以從此鏈接了解它。這將幫助您更詳細(xì)地了解 JavaScript 代碼的工作原理。

讓我們仔細(xì)看看代碼片段:

function foo() {
    console.log(a);
}


function bar() {
    var a = 3;
    foo();
}


var a = 5;
bar();

該代碼定義了 2 個(gè)函數(shù) foo() 和 bar() 以及一個(gè)值為 5 的變量 a。所有這些聲明都發(fā)生在全局范圍內(nèi)。在 bar() 函數(shù)內(nèi)部,聲明了一個(gè)變量 a 并賦值為 3。那么當(dāng)調(diào)用 thebar() 函數(shù)時(shí),你認(rèn)為它會(huì)打印 a 的值是多少?

當(dāng) JavaScript 引擎執(zhí)行此代碼時(shí),聲明全局變量 a 并為其賦值 5。然后,調(diào)用 bar() 函數(shù)。在 bar() 函數(shù)內(nèi)部,聲明了一個(gè)局部變量 a 并賦值為 3。該局部變量 a 與全局變量 a 不同。之后,從 bar() 函數(shù)內(nèi)部調(diào)用 foo() 函數(shù)。

在 foo() 函數(shù)內(nèi)部,console.log(a) 語(yǔ)句嘗試記錄 a 的值。由于 foo() 函數(shù)的作用域內(nèi)沒(méi)有定義局部變量 a,JavaScript 會(huì)查找作用域鏈以找到最近的名為 a 的變量。作用域鏈?zhǔn)侵负瘮?shù)在嘗試查找和使用變量時(shí)可以訪問(wèn)的所有不同作用域。

現(xiàn)在,我們來(lái)解決 JavaScript 將在哪里搜索變量 a 的問(wèn)題。它會(huì)在 bar 函數(shù)的范圍內(nèi)查找,還是會(huì)探索全局范圍?事實(shí)證明,JavaScript 將在全局范圍內(nèi)進(jìn)行搜索,而這種行為是由稱(chēng)為詞法范圍的概念驅(qū)動(dòng)的。

詞法作用域是指函數(shù)或變量在代碼中編寫(xiě)時(shí)的作用域。當(dāng)我們定義 foo 函數(shù)時(shí),它被授予訪問(wèn)其自己的本地作用域和全局作用域的權(quán)限。無(wú)論我們?cè)谀睦镎{(diào)用 foo 函數(shù),無(wú)論是在 bar 函數(shù)內(nèi)部還是將其導(dǎo)出到另一個(gè)模塊并在那里運(yùn)行,這個(gè)特征都保持一致。詞法范圍不是由我們調(diào)用函數(shù)的位置決定的。

這樣做的結(jié)果是輸出始終相同:在全局范圍內(nèi)找到的 a 值,在本例中為 5。

但是,如果我們?cè)?bar 函數(shù)中定義了 foo 函數(shù),則會(huì)出現(xiàn)不同的情況:

function bar() {
  var a = 3;


  function foo() {
    console.log(a);
  }


  foo();
}


var a = 5;
bar();

在這種情況下, foo 的詞法作用域?qū)齻€(gè)不同的作用域:它自己的局部作用域、 bar 函數(shù)的作用域和全局作用域。詞法范圍由編譯時(shí)將代碼放置在源代碼中的位置決定。

當(dāng)此代碼運(yùn)行時(shí),foo 位于 bar 函數(shù)內(nèi)。這種安排改變了范圍動(dòng)態(tài)?,F(xiàn)在,當(dāng) foo 嘗試訪問(wèn)變量 a 時(shí),它將首先在其自己的本地范圍內(nèi)進(jìn)行搜索。由于它在那里找不到 a,因此它將搜索范圍擴(kuò)大到 bar 函數(shù)的范圍。你瞧,a 存在,其值為 3。因此,控制臺(tái)語(yǔ)句將打印 3。

5、對(duì)象強(qiáng)制

const obj = {
  valueOf: () => 42,
  toString: () => 27
};
console.log(obj + '');

值得探索的一個(gè)有趣的方面是 JavaScript 如何處理對(duì)象到原始值(例如字符串、數(shù)字或布爾值)的轉(zhuǎn)換。這是一個(gè)有趣的問(wèn)題,測(cè)試您是否知道強(qiáng)制轉(zhuǎn)換如何與對(duì)象一起使用。

在字符串連接或算術(shù)運(yùn)算等場(chǎng)景中處理對(duì)象時(shí),這種轉(zhuǎn)換至關(guān)重要。為了實(shí)現(xiàn)這一點(diǎn),JavaScript 依賴(lài)于兩個(gè)特殊的方法:valueOf 和 toString。

valueOf 方法是 JavaScript 對(duì)象轉(zhuǎn)換機(jī)制的基本部分。當(dāng)在需要原始值的上下文中使用對(duì)象時(shí),JavaScript 首先在對(duì)象中查找 valueOf 方法。

如果 valueOf 方法不存在或未返回適當(dāng)?shù)脑贾担琂avaScript 將回退到 toString 方法。該方法負(fù)責(zé)提供對(duì)象的字符串表示形式。

回到我們?cè)瓉?lái)的代碼片段:

const obj = {
  valueOf: () => 42,
  toString: () => 27
};


console.log(obj + '');

當(dāng)我們運(yùn)行此代碼時(shí),對(duì)象 obj 被轉(zhuǎn)換為原始值。在本例中,valueOf 方法返回 42,然后,由于與空字符串連接而隱式轉(zhuǎn)換為字符串。因此,代碼的輸出將為 42。

但是,如果 valueOf 方法不存在或未返回適當(dāng)?shù)脑贾担琂avaScript 將回退到 toString 方法。讓我們修改一下之前的例子:

const obj = {
  toString: () => 27
};


console.log(obj + '');

這里,我們刪除了 valueOf 方法,只留下 toString 方法,該方法返回?cái)?shù)字 27。在這種情況下,JavaScript 將訴諸 toString 方法進(jìn)行對(duì)象轉(zhuǎn)換。

6、理解對(duì)象鍵

在 JavaScript 中使用對(duì)象時(shí),了解如何在其他對(duì)象的上下文中處理和分配鍵非常重要。考慮以下代碼片段并花一些時(shí)間猜測(cè)輸出:

let a = {};
let b = { key: 'test' };
let c = { key: 'test' };


a[b] = '123';
a[c] = '456';


console.log(a);

乍一看,這段代碼似乎應(yīng)該生成一個(gè)具有兩個(gè)不同鍵值對(duì)的對(duì)象 a。然而,由于 JavaScript 對(duì)對(duì)象鍵的處理方式,結(jié)果完全不同。

JavaScript 使用默認(rèn)的 toString() 方法將對(duì)象鍵轉(zhuǎn)換為字符串。但為什么?在 JavaScript 中,對(duì)象鍵始終是字符串(或符號(hào)),或者它們通過(guò)隱式強(qiáng)制轉(zhuǎn)換自動(dòng)轉(zhuǎn)換為字符串。當(dāng)您使用字符串以外的任何值(例如數(shù)字、對(duì)象或符號(hào))作為對(duì)象中的鍵時(shí),JavaScript 會(huì)在將該值用作鍵之前在內(nèi)部將該值轉(zhuǎn)換為其字符串表示形式。

因此,當(dāng)我們使用對(duì)象 b 和 c 作為對(duì)象 a 中的鍵時(shí),兩者都會(huì)轉(zhuǎn)換為相同的字符串表示形式:[object Object]。由于這種行為,第二個(gè)賦值 a[b] = '123'; 將覆蓋第一個(gè)賦值 a[c] = '456';。

現(xiàn)在,讓我們逐步分解代碼:

  • let a = {};:初始化一個(gè)空對(duì)象a。
  • let b = { key: 'test' };: 創(chuàng)建一個(gè)對(duì)象 b,其屬性鍵值為 'test'。
  • let c = { key: 'test' };: 定義另一個(gè)與 b 結(jié)構(gòu)相同的對(duì)象 c。
  • a[b] = '123';:將對(duì)象a中鍵為[object Object]的屬性設(shè)置為值'123'。

a[c] = '456';:將對(duì)象 a 中鍵 [object Object] 相同屬性的值更新為 '456',替換之前的值。

兩個(gè)分配都使用相同的鍵字符串 [object Object]。結(jié)果,第二個(gè)賦值會(huì)覆蓋第一個(gè)賦值設(shè)置的值。

當(dāng)我們記錄對(duì)象 a 時(shí),我們觀察到以下輸出:

{ '[object Object]': '456' }

7、==運(yùn)算符

console.log([] == ![]);

這個(gè)有點(diǎn)復(fù)雜。那么,您認(rèn)為輸出會(huì)是什么?讓我們逐步評(píng)估一下。讓我們首先看看兩個(gè)操作數(shù)的類(lèi)型:

typeof([]) // "object"
typeof(![]) // "boolean"

對(duì)于[]來(lái)說(shuō)它是一個(gè)對(duì)象,這是可以理解的。JavaScript 中的一切都是對(duì)象,包括數(shù)組和函數(shù)。但是操作數(shù)![]如何具有布爾類(lèi)型呢?讓我們?cè)囍斫膺@一點(diǎn)。當(dāng)你使用 ! 對(duì)于原始值,會(huì)發(fā)生以下轉(zhuǎn)換:

假值:如果原始值是假值(例如 false、0、null、undefined、NaN 或空字符串 ''),則應(yīng)用 ! 會(huì)將其轉(zhuǎn)換為 true。

真值:如果原始值是真值(任何非假值),則應(yīng)用!會(huì)將其轉(zhuǎn)換為 false。

在我們的例子中,[] 是一個(gè)空數(shù)組,它是 JavaScript 中的真值。由于 [] 為真,所以 ![] 變?yōu)榧佟K?,我們的表達(dá)式就變成了:

[] == ![]
[] == false

現(xiàn)在讓我們繼續(xù)了解 == 運(yùn)算符。每當(dāng)使用 == 運(yùn)算符比較 2 個(gè)值時(shí),JavaScript 就會(huì)執(zhí)行抽象相等比較算法。 

該算法有以下步驟:

正如您所看到的,該算法考慮了比較值的類(lèi)型并執(zhí)行必要的轉(zhuǎn)換。

對(duì)于我們的例子,我們將 x 表示為 [],將 y 表示為 ![]。我們檢查了 x 和 y 的類(lèi)型,發(fā)現(xiàn) x 是對(duì)象,y 是布爾值。由于 y 是布爾值,x 是對(duì)象,因此應(yīng)用抽象相等比較算法中的條件 7:

如果 Type(y) 為 Boolean,則返回 x == ToNumber(y) 的比較結(jié)果。

這意味著如果其中一種類(lèi)型是布爾值,我們需要在比較之前將其轉(zhuǎn)換為數(shù)字。ToNumber(y) 的值是多少?正如我們所看到的,[] 是一個(gè)真值,否定則使其為假。結(jié)果,Number(false)為0。

[] == false
[] == Number(false)
[] == 0

現(xiàn)在我們有了比較 [] == 0,這次條件 8 開(kāi)始發(fā)揮作用:

如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object,則返回比較結(jié)果 x == ToPrimitive(y)。

基于這個(gè)條件,如果其中一個(gè)操作數(shù)是對(duì)象,我們必須將其轉(zhuǎn)換為原始值。這就是 ToPrimitive 算法發(fā)揮作用的地方。我們需要將 [] x 轉(zhuǎn)換為原始值。數(shù)組是 JavaScript 中的對(duì)象。正如我們之前所看到的,當(dāng)將對(duì)象轉(zhuǎn)換為基元時(shí),valueOf 和 toString 方法就會(huì)發(fā)揮作用。 

在這種情況下, valueOf 返回?cái)?shù)組本身,它不是有效的原始值。因此,我們轉(zhuǎn)向 toString 進(jìn)行輸出。將 toString 方法應(yīng)用于空數(shù)組會(huì)得到一個(gè)空字符串,這是一個(gè)有效的原語(yǔ):

[] == 0
[].toString() == 0
"" == 0

將空數(shù)組轉(zhuǎn)換為字符串會(huì)得到一個(gè)空字符串“”,現(xiàn)在我們面臨比較:“”== 0。

現(xiàn)在,其中一個(gè)操作數(shù)是字符串類(lèi)型,另一個(gè)操作數(shù)是數(shù)字類(lèi)型,則條件 5 成立:

如果 Type(x) 是 String 并且 Type(y) 是 Number,則返回比較結(jié)果 ToNumber(x) == y。

因此,我們需要將空字符串“”轉(zhuǎn)換為數(shù)字,即為 0。

"" == 0
ToNumber("") == 0
0 == 0

最后,兩個(gè)操作數(shù)具有相同的類(lèi)型并且條件 1 成立。由于兩者具有相同的值,因此,最終輸出為:

0 == 0 // true

到目前為止,我們?cè)谔剿鞯淖詈髱讉€(gè)問(wèn)題中使用了強(qiáng)制轉(zhuǎn)換,這是掌握 JavaScript 和在面試中解決此類(lèi)問(wèn)題的重要概念,這些問(wèn)題往往會(huì)被問(wèn)到很多。 

8、閉包

這是與閉包相關(guān)的最著名的面試問(wèn)題之一:

const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function() {
    console.log('Index: ' + i + ', element: ' + arr[i]);
  }, 3000);
}

如果您知道輸出,那就好了。那么,讓我們嘗試?yán)斫膺@個(gè)片段。從表面上看,這段代碼片段將為我們提供以下輸出:

Index: 0, element: 10
Index: 1, element: 12
Index: 2, element: 15
Index: 3, element: 21

但這里的情況并非如此。由于閉包的概念以及 JavaScript 處理變量作用域的方式,實(shí)際的輸出會(huì)有所不同。當(dāng)延遲 3000 毫秒后執(zhí)行 setTimeout 回調(diào)時(shí),它們都將引用同一個(gè)變量 i,循環(huán)完成后該變量的最終值為 4。結(jié)果,代碼的輸出將是:

Index: 4, element: undefined
Index: 4, element: undefined
Index: 4, element: undefined
Index: 4, element: undefined

出現(xiàn)此行為的原因是 var 關(guān)鍵字沒(méi)有塊作用域,并且 setTimeout 回調(diào)捕獲對(duì)同一 i 變量的引用。當(dāng)回調(diào)執(zhí)行時(shí),它們都會(huì)看到 i 的最終值,即 4,并嘗試訪問(wèn)未定義的 arr[4]。

為了實(shí)現(xiàn)所需的輸出,您可以使用 let 關(guān)鍵字為循環(huán)的每次迭代創(chuàng)建一個(gè)新范圍,確保每個(gè)回調(diào)捕獲 i 的正確值:

const arr = [10, 12, 15, 21];
for (let i = 0; i < arr.length; i++) {
  setTimeout(function() {
    console.log('Index: ' + i + ', element: ' + arr[i]);
  }, 3000);
}

通過(guò)此修改,您將獲得預(yù)期的輸出:

Index: 0, element: 10
Index: 1, element: 12
Index: 2, element: 15
Index: 3, element: 21

使用 let 在每次迭代中為 i 創(chuàng)建一個(gè)新的綁定,確保每個(gè)回調(diào)引用正確的值。

通常,開(kāi)發(fā)人員已經(jīng)熟悉涉及 let 關(guān)鍵字的解決方案。然而,面試有時(shí)會(huì)更進(jìn)一步,挑戰(zhàn)你在不使用 let 的情況下解決問(wèn)題。在這種情況下,另一種方法是通過(guò)立即調(diào)用循環(huán)內(nèi)的函數(shù)(IIFE)來(lái)創(chuàng)建閉包。這樣,每個(gè)函數(shù)調(diào)用都有自己的 i 副本。您可以這樣做:

const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
  (function(index) {
    setTimeout(function() {
      console.log('Index: ' + index + ', element: ' + arr[index]);
    }, 3000);
  })(i);
}

在此代碼中,立即調(diào)用的函數(shù) (function(index) { ... })(i); 為每次迭代創(chuàng)建一個(gè)新范圍,捕獲 i 的當(dāng)前值并將其作為索引參數(shù)傳遞。這確保每個(gè)回調(diào)函數(shù)都有自己?jiǎn)为?dú)的索引值,防止與閉包相關(guān)的問(wèn)題并為您提供預(yù)期的輸出:

Index: 0, element: 10
Index: 1, element: 12
Index: 2, element: 15
Index: 3, element: 21

最后總結(jié)

以上就是我今天這篇文章想與您分享的8個(gè)關(guān)于JS的前端面試題, 我希望這篇文章對(duì)您的面試準(zhǔn)備之旅有所幫助。 

如果您還有任何疑問(wèn),請(qǐng)?jiān)诹粞詤^(qū)給我們留言,我們一起交流學(xué)習(xí)進(jìn)步。

責(zé)任編輯:華軒 來(lái)源: web前端開(kāi)發(fā)
相關(guān)推薦

2023-09-20 08:03:32

JavaScript編程語(yǔ)言

2023-05-18 15:34:52

JavaScript開(kāi)發(fā)前端

2017-08-29 14:12:16

Java面試題

2025-02-07 15:01:49

Promise數(shù)組前端

2024-03-06 13:56:00

項(xiàng)目awaitpromise

2024-01-02 16:16:34

Promise前端

2015-07-31 09:34:44

Java面試題

2023-09-22 12:14:33

2015-08-27 09:27:34

JavaScript面試題

2023-09-21 14:55:24

Web 開(kāi)發(fā)TypeScript

2013-01-05 14:51:34

JavaScriptjQuery面試

2024-06-04 14:52:28

2024-07-02 09:03:48

2024-11-28 08:33:16

JavaScrip事件循環(huán)this

2025-01-09 12:00:00

JavaScript前端數(shù)組

2023-11-27 16:11:14

Web 開(kāi)發(fā)HTML

2010-05-10 13:40:22

CCIE思科認(rèn)證

2025-03-26 05:00:00

前端開(kāi)發(fā)者DOM

2022-05-08 19:58:10

JSONPJavaScript

2022-06-17 09:47:04

Linux命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)