成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

最難的 JavaScript 面試題解析

開發(fā) 前端
這道題表面看起來是簡單的輸出預(yù)測,但實際上需要對 JavaScript 的事件循環(huán)、this 綁定規(guī)則和原型鏈有全面的理解。通過這類問題的深入分析,不僅可以提升代碼閱讀能力,也能更自信地處理實際開發(fā)中的復(fù)雜場景。

覺得自己的 JavaScript 功底還不錯?那來試試這道復(fù)雜的面試題吧!

下面是一段代碼,請分析每一行的輸出,并解釋其背后的原因。

問題描述

以下是代碼,預(yù)測輸出并說明邏輯:

function Foo() {
  this.value = 42;
}

Foo.prototype.getValue = function() {
  return this.value;
};

const obj1 = new Foo();
const obj2 = {
  value: 24,
  getValue: obj1.getValue
};

console.log(obj1.getValue());      // A
console.log(obj2.getValue());      // B

setTimeout(function() {
  console.log(obj1.getValue());    // C
  obj2.value = 100;
  console.log(obj2.getValue());    // D
}, 0);

Promise.resolve().then(() => {
  obj1.value = 84;
  console.log(obj1.getValue());    // E
});

console.log(obj1.getValue());      // F

分析與輸出

A:obj1.getValue()

console.log(obj1.getValue()); // A

解釋

  • obj1 是 Foo 的實例,obj1.getValue() 調(diào)用的是原型上的 getValue 方法。
  • 方法中的 this 指向 obj1,返回 this.value。
  • obj1.value 初始化為 42,因此輸出:

輸出:42

B:obj2.getValue()

console.log(obj2.getValue()); // B

解釋

  • obj2.getValue 是直接引用了 obj1.getValue,但調(diào)用時通過 obj2.getValue()。
  • 在 JavaScript 中,this 的綁定依賴調(diào)用的對象。在這里,this 指向 obj2。
  • obj2.value 為 24,因此輸出:

輸出24

F:同步執(zhí)行的 obj1.getValue()

console.log(obj1.getValue()); // F

解釋

  • 此處仍是 obj1.getValue() 的調(diào)用,且 obj1.value 尚未被異步代碼修改。
  • 因此輸出和 A 一樣,為:

輸出42

E:Promise 中的 obj1.getValue()

Promise.resolve().then(() => {
  obj1.value = 84;
  console.log(obj1.getValue()); // E
});

解釋

  • Promise 的回調(diào)是微任務(wù),在同步代碼執(zhí)行完后立即執(zhí)行。
  • 回調(diào)中將 obj1.value 修改為 84,隨后調(diào)用 obj1.getValue()。
  • 因此此處返回的是更新后的值:

輸出84

C:setTimeout 中的 obj1.getValue()

setTimeout(function() {
  console.log(obj1.getValue()); // C
  obj2.value = 100;
  console.log(obj2.getValue()); // D
}, 0);

解釋

  • setTimeout 的回調(diào)是宏任務(wù),在同步代碼和微任務(wù)都執(zhí)行完后才會執(zhí)行。
  • 此時,obj1.value 已被微任務(wù)修改為 84,調(diào)用 obj1.getValue() 返回的是修改后的值:

輸出84

D:setTimeout 中的 obj2.getValue()

console.log(obj2.getValue()); // D

解釋

  • 在 setTimeout 的回調(diào)中,obj2.value 被修改為 100。
  • 調(diào)用 obj2.getValue(),this 仍指向 obj2,因此返回的是更新后的值:

輸出100

完整輸出順序

  • A:42
  • B:24
  • F:42
  • E:84
  • C:84
  • D:100

背后的知識點

這道題涉及了 JavaScript 中多個高級概念,是對語言機制的一次全面考察:

原型繼承

  • obj1 調(diào)用了 Foo 構(gòu)造函數(shù),通過原型鏈繼承了 getValue 方法。

動態(tài)綁定的 this: 

  • this 的指向取決于函數(shù)的調(diào)用方式,而不是定義時的上下文。

事件循環(huán)與任務(wù)隊列

  • 同步代碼優(yōu)先執(zhí)行,Promise 的微任務(wù)隊列緊隨其后,而 setTimeout 的回調(diào)則在最后的宏任務(wù)隊列中執(zhí)行。

值的動態(tài)修改

  • 不同任務(wù)(同步、微任務(wù)、宏任務(wù))對變量的修改會影響之后的結(jié)果。

總結(jié)

這道題表面看起來是簡單的輸出預(yù)測,但實際上需要對 JavaScript 的事件循環(huán)、this 綁定規(guī)則和原型鏈有全面的理解。通過這類問題的深入分析,不僅可以提升代碼閱讀能力,也能更自信地處理實際開發(fā)中的復(fù)雜場景。

責(zé)任編輯:姜華 來源: 大遷世界
相關(guān)推薦

2019-08-13 08:43:07

JavaScript前端面試題

2018-03-06 15:30:47

Java面試題

2024-06-04 14:52:28

2013-01-05 14:51:34

JavaScriptjQuery面試

2021-01-14 05:12:19

Http協(xié)議面試

2021-04-23 14:14:46

設(shè)計模式對象

2023-07-28 07:18:39

final繼承結(jié)構(gòu)

2022-05-08 19:58:10

JSONPJavaScript

2024-02-26 15:35:44

2024-01-01 15:30:59

JavaScriptWeb 應(yīng)用程序開發(fā)

2015-08-27 09:27:34

JavaScript面試題

2014-09-19 11:17:48

面試題

2020-06-04 14:40:40

面試題Vue前端

2010-11-26 10:31:44

2023-11-13 07:37:36

JS面試題線程

2011-03-24 13:27:37

SQL

2023-09-04 08:28:34

JavaScripforEach 循環(huán)

2011-06-07 08:55:25

2023-07-05 07:30:44

StringHashMapKey類型

2025-01-09 12:00:00

JavaScript前端數(shù)組
點贊
收藏

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

主站蜘蛛池模板: 91porn在线观看| 欧美中文字幕一区 | 五月婷婷婷| 高清18麻豆 | 国产欧美精品一区二区三区 | 国产精品欧美一区二区三区不卡 | 99精品免费久久久久久久久日本 | 久久免费观看一级毛片 | 久久亚洲天堂 | 精品久久久久久亚洲综合网 | 99精品网 | 亚洲一区二区三区在线播放 | 中文字幕成人免费视频 | 国产羞羞视频在线观看 | 亚洲欧美综合 | 91精品久久久久久久久久入口 | 秋霞a级毛片在线看 | 亚洲在线| 天天操夜夜操免费视频 | 成人免费在线观看视频 | 成人免费小视频 | jlzzjlzz国产精品久久 | 亚洲精品在线视频 | 国产三级 | 日本不卡一区二区三区 | 在线观看日韩 | 欧美激情 一区 | 91精品国产综合久久久久蜜臀 | 欧美一级片 | 欧美久久一级 | 中文字幕亚洲在线 | 国产农村妇女精品一区 | av超碰 | 欧美日韩在线观看视频 | 午夜精品一区二区三区在线观看 | 亚洲精品久久久久久国产精华液 | 欧美精品一二区 | 中文字幕一区二区三区四区五区 | 欧美欧美欧美 | 偷拍亚洲色图 | 免费同性女女aaa免费网站 |