JavaScript 是一種常用的腳本語(yǔ)言,在前端開(kāi)發(fā)中具有重要的作用。作為前端開(kāi)發(fā)者,我們需要了解一些 JavaScript 的知識(shí)。在面試中經(jīng)常會(huì)遇到一些 JavaScript 相關(guān)的考題。下面我就來(lái)介紹一些常見(jiàn)的 JavaScript 考題。
首先我們來(lái)看一個(gè)簡(jiǎn)單的 JavaScript 考題:
var a = 10; (function() { alert(a) })();
運(yùn)行后的結(jié)果是什么呢?答案是 10。因?yàn)樵诤瘮?shù)內(nèi)部沒(méi)有聲明與變量 a 同名的變量,所以會(huì)訪問(wèn)外部的變量 a。
接下來(lái)看一個(gè)閉包相關(guān)的考題:
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i) }, i * 1000) }
運(yùn)行這段代碼后會(huì)輸出什么?答案是 5 個(gè) 5,因?yàn)?setTimeout 是異步執(zhí)行的,當(dāng)函數(shù)執(zhí)行時(shí),for 循環(huán)已經(jīng)結(jié)束,此時(shí) i 的值已經(jīng)變成了 5。正確的做法是使用閉包來(lái)保存 i 的值:
for (var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i) }, i * 1000) })(i) }
再來(lái)看一個(gè)關(guān)于 this 的考題:
var obj = { name: 'Alice', sayName: function() { console.log(this.name) } } setTimeout(obj.sayName, 1000);
運(yùn)行后會(huì)輸出什么?答案是 undefined,因?yàn)?setTimeout 中的函數(shù)是在全局作用域中執(zhí)行的,此時(shí)的 this 指向全局對(duì)象 window。正確的做法是使用匿名函數(shù)來(lái)改變 this 的指向:
setTimeout(function() { obj.sayName() }, 1000);
最后來(lái)看一個(gè)關(guān)于繼承的考題:
function Person(name) { this.name = name } Person.prototype.sayName = function() { console.log(this.name) } function Student(name, grade) { Person.call(this, name) this.grade = grade } Student.prototype = Object.create(Person.prototype) Student.prototype.constructor = Student var s = new Student('Bob', 3) s.sayName()
運(yùn)行后會(huì)輸出什么?答案是 Bob,因?yàn)?Student 繼承了 Person 的原型,所以可以調(diào)用 Person 中的方法。
總結(jié)來(lái)說(shuō),JavaScript 考題涉及的知識(shí)點(diǎn)比較廣泛,包括作用域、閉包、this、繼承等。掌握這些知識(shí)點(diǎn)可以幫助我們更好地理解和應(yīng)用 JavaScript。在面試中,我們需要做好準(zhǔn)備,提前學(xué)習(xí)相關(guān)的知識(shí)點(diǎn),并鍛煉我們的思考能力和編程能力。