作用域是在程序執(zhí)行過程中變量生效的區(qū)域。在JavaScript中,作用域是從變量聲明位置開始,到最近的父級作用域結(jié)束。作用域能幫助我們控制變量的生命周期,確保代碼的正確性和可維護(hù)性。下面我們將介紹一些常見的JavaScript作用域面試題目。題目一代碼:
var a = 1; function foo(){ console.log(a); var a = 2; } foo();輸出結(jié)果是什么?
答案:
undefined
解析:
在函數(shù)內(nèi)部,使用了var關(guān)鍵字聲明了一個新的變量a,因此函數(shù)內(nèi)部的a和外部的a是不同的變量。在變量提升階段,函數(shù)內(nèi)部的變量a會被聲明,但不會被賦值,因此第一次console.log打印的是undefined。題目二代碼:var a = 1; function foo(){ console.log(a); a = 2; } foo();輸出結(jié)果是什么?
答案:
1
解析:
在函數(shù)內(nèi)部,沒有使用var關(guān)鍵字聲明變量a,因此函數(shù)內(nèi)部的a指向了外部的a。因此在console.log打印的時候,輸出的是外部的a的值1。在函數(shù)內(nèi)部修改了變量a的值,這個修改會影響到全局的變量a的值。題目三代碼:for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); }輸出結(jié)果是什么?
答案:
5 5 5 5 5
解析:
循環(huán)中的setTimeout異步方法會在1秒之后調(diào)用console.log方法,此時循環(huán)已經(jīng)執(zhí)行完畢,變量i的值變?yōu)榱?。因此在輸出結(jié)果中,都是輸出了變量i的最終值5。題目四代碼:for (let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); }輸出結(jié)果是什么?
答案:
0 1 2 3 4
解析:
在循環(huán)中使用let關(guān)鍵字聲明變量i,它會創(chuàng)建一個塊級作用域,在每次循環(huán)時都會重新聲明一個新的變量i。因此在輸出結(jié)果中,分別輸出了變量i的值0,1,2,3和4。題目五代碼:function outer() { var a = 2; function inner() { console.log(a); } return inner; } var func = outer(); func();輸出結(jié)果是什么?
答案:
2
解析:
函數(shù)outer返回函數(shù)inner,變量a的值為2。將返回的函數(shù)inner賦值給變量func,調(diào)用func方法時,輸出的是outer函數(shù)內(nèi)部定義的變量a的值2。因為在函數(shù)outer的內(nèi)部定義的變量a是函數(shù)inner的一個閉包。總結(jié)在JavaScript中,作用域是非常重要的概念。面試過程中經(jīng)常會問到有關(guān)作用域的問題。我們可以通過實踐題目來加深我們對于作用域的理解,提高我們的技能和應(yīng)變能力。上一篇php 上標(biāo)
下一篇php 不是語音