本篇內容主要講解“JavaScript作用域編寫提升的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JavaScript作用域編寫提升的方法是什么”吧!
創(chuàng)新互聯(lián)建站長期為上千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為潮州企業(yè)提供專業(yè)的成都做網站、成都網站設計,潮州網站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
把變量與函數(shù)的聲明移到編寫所處作用域的最上面,叫作提升。
如下代碼:
console.log(name); // undefined var name = 'Rewa Fang'; console.log(name); // Rewa Fang
第一次打印name
時,輸出undefined
而不是拋出異常ReferenceError
。 正是因為變量name
聲明被提升了。 但只提升聲明,賦值不會提升;所以輸出undefined
。 第二次打印時,name
已經被賦值為Rewa Fang
。
提升后的代碼:
var name; console.log(name); // undefined name = 'Rewa Fang'; console.log(name); // Rewa Fang
代碼改成下面這種寫法也是可正常執(zhí)行的:
name = 'Rewa Fang'; console.log(name); // Rewa Fang var name;
var name;
會被提升到最上面。
這是因為編譯器在編譯階段會找到代碼中所有的聲明,并綁定在對應的作用域中。而賦值和其它邏輯代碼會留在原地;等待執(zhí)行。 比如: var a = 1;
會被編譯器看作兩個部分聲明var a;
和賦值a = 1;
,那么聲明會提升到作用域最上面,賦值則在原地等執(zhí)行。
包含函數(shù)聲明也會提升。
sayHi(); // Hello! function sayHi(){ console.log('Hello!'); }
函數(shù)sayHi()可以正常執(zhí)行;因為函數(shù)聲明的部分被提升了。提升為:
function sayHi(){ console.log('Hello!'); } sayHi(); // Hello!
函數(shù)內部的變量和函數(shù)也會提升至函數(shù)最上面:
var name = 'Lebron James'; sayHi(); // Hello! Rewa Fang function sayHi(){ name = 'Rewa Fang'; console.log('Hello! '+name); var name; }
函數(shù)內的name會提升至函數(shù)創(chuàng)建的作用域最上面,所以函數(shù)內部不會引用到外部name。 內部的name遮蔽了外部變量name。
提升后:
function sayHi(){ var name; name = 'Rewa Fang'; console.log('Hello! '+name); } var name; name = 'Lebron James'; sayHi(); // Hello! Rewa Fang
提升后有一個變化,就是函數(shù)聲明會優(yōu)先于變量提升。
比如:
console.log(sayHi); var sayHi = 'Lebron James'; function sayHi(){ console.log('Hello! '); }
結果會輸出:? sayHi(){console.log('Hello! ');}
node環(huán)境下輸出:[Function: sayHi]
為什么需要提升?
有以下原因:
優(yōu)化性能; 編譯器在代碼運行前進行編譯會預先處理變量和函數(shù)的聲明,統(tǒng)一管理作用域。保持代碼由上而下的順序變量在引用之前聲明。 不過代碼的順序是可以人為控制的,像Java不需要提升開發(fā)者可以有效地管理好變量的聲明。 所以這可能并不是最重要的提升原因,也可能是個歷史遺留問題。
函數(shù)間的相互調用; 如下代碼,如果函數(shù)b沒有提升; 函數(shù)a中調用就會拋出異常;提升就可以讓函數(shù)式編程變得更靈活。
function a (){ var a = 1; return b(a); } function b(num){ return num * 2; }
PS: ES6中 let const 不會被提升
到此,相信大家對“JavaScript作用域編寫提升的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!