作為前端工程師,javascript作為一門必備技能之一,因此掌握javascript作用域的概念和實現(xiàn)是非常重要的。
作用域是指在程序中定義變量的區(qū)域,它決定了變量的可見范圍和生命周期。
javascript的作用域主要分為全局作用域和函數(shù)作用域,其中全局作用域是指定義在全局范圍內(nèi)的變量,而函數(shù)作用域則是指定義在函數(shù)內(nèi)部的變量。
// 全局作用域 var num = 10; function test(){ // 函數(shù)作用域 var num1 = 20; }
在javascript中,變量的查找一般從內(nèi)部作用域開始往外查找,即如果當(dāng)前作用域沒有定義該變量,則會去外部作用域查找,直到找到全局作用域。
// 查找變量num的值,先在函數(shù)內(nèi)部查找,找不到再去全局查找 var num = 10; function test(){ var num = 20; console.log(num); // 20 } test(); console.log(num); // 10
在javascript中還存在著詞法作用域和動態(tài)作用域的概念,其中詞法作用域是在代碼編寫期間就確定了變量查找的作用域范圍,而動態(tài)作用域則是在代碼運行期間才確定變量的作用域。
// 詞法作用域 var a = 10; function test(){ console.log(a); } test(); // 10 // 動態(tài)作用域 function foo(){ console.log(b); } function bar(){ var b = 20; foo(); } var b = 30; bar(); // 30
最后,javascript作用域的面試題也非常常見,例如下面的代碼:
// 面試題一: var name = "Tom"; function showName(){ console.log(name); var name = "Jerry"; console.log(name); } showName(); // undefined Jerry // 面試題二: function showNum(){ for(var i=0;i<5;i++){ setTimeout(function(){ console.log(i); },i*1000); } } showNum(); // 5 5 5 5 5
這些面試題實際上都是考察對javascript作用域的理解和掌握程度,因此我們需要認(rèn)真掌握javascript作用域的各種概念和特性,才能在面試中做到游刃有余。