摘要:賦值優(yōu)先于函數(shù)聲明第二個輸出可以看出我是變量又把覆蓋掉了。優(yōu)先級高于預(yù)定義變量。不是,說明沒有被聲明覆蓋聲明不賦值優(yōu)先級高于函數(shù)外部作用域的其他所有聲明。
我們先來看看下面的例子:
alert(a);//輸出:function a(){ alert("我是函數(shù)") } function a(){ alert("我是函數(shù)") }// var a = "我是變量"; alert(a); //輸出:"我是變量"
這代碼等效于:
function a(){alert("我是函數(shù)")} var a; //hoisting alert(a); //輸出:function a(){ alert("我是函數(shù)") } a = "我是變量";//賦值 alert(a); //輸出:"我是變量"
這短短的代碼里面其實(shí)說明了兩個問題:
function聲明的優(yōu)先級高于var聲明:第一個alert輸出可以看出var a;被function a(){}覆蓋掉了。
賦值優(yōu)先于函數(shù)聲明:第二個alert輸出可以看出a="我是變量"又把function a(){}覆蓋掉了。
把一個變量添加到作用域中除有很多方法,如下:
javascript語言預(yù)定義的,比如說this,arguments
formal parameter(也就是中文說的形參吧)
var聲明并賦值,比如說var a = 10;
var聲明不賦值,比如說var a;
function聲明,比如說function a(){};
我們來看看他們之間的優(yōu)先級:
1.var聲明并賦值優(yōu)先級高于function聲明
這個上面已經(jīng)說了。
2.function聲明優(yōu)先級高于formal parameter
function fnTest(a){ alert(a); function a(){return "我優(yōu)先"} } fnTest(100);//:function a(){return "我優(yōu)先"}。可以看出function聲明覆蓋了`formal parameter`。
3.formal parameter優(yōu)先級高于預(yù)定義變量
function fnTest(arguments){ alert(arguments); } fnTest(100);//:100。說明`formal parameter`優(yōu)先級比預(yù)定義的arguments高
對比以下:
function fnTest(a){ alert(arguments); } fnTest(100);//:[Object Arguments] {0:100,length:1}。當(dāng)沒有沖突時輸出便是預(yù)定義的arguments
4.formal parameter優(yōu)先級高于var聲明不賦值
function fnTest(a){ alert(a); var a; } fnTest(100);//:100。很明顯,不多說
5.預(yù)定義變量優(yōu)先級高于 var聲明不賦值
function fnTest(){ alert(arguments); var arguments; } fnTest();//:[Object Arguments]。不是undefined,說明arguments沒有被var聲明覆蓋
6.var聲明不賦值優(yōu)先級高于函數(shù)外部作用域的其他所有聲明
function fnTest(){ alert(fnTest); var fnTest; } fnTest();//:undefined。
對比如下:
function fnTest(){ // alert(fnTest); // } // fnTest(); //輸出function fnTest(){alert(fnTest);}
這也正好印證了作用域鏈查找變量的方式:在局部作用域里查找(若找到則返回,不必往下繼續(xù)查找) ==> 在上一級作用域里查找... ==> 直到全局作用域(若找不到則返回typeError)
最后看看下面的綜合例子:
function fnTest(arguments){// alert(arguments);//function arguments(){return "hello world"} var arguments = 99;// function arguments(){return "hello world"}; alert(arguments);//99 } fnTest(100);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87627.html
摘要:延長作用域鏈下面兩種語句可以在作用域鏈的前端臨時增加一個變量對象以延長作用域鏈, 問題 今天看筆記發(fā)現(xiàn)自己之前記了一個關(guān)于同名標(biāo)識符優(yōu)先級的內(nèi)容,具體是下面這樣的: 形參優(yōu)先級高于當(dāng)前函數(shù)名,低于內(nèi)部函數(shù)名 形參優(yōu)先級高于arguments 形參優(yōu)先級高于只聲明卻未賦值的局部變量,但是低于聲明且賦值的局部變量 函數(shù)和變量都會聲明提升,函數(shù)名和變量名同名時,函數(shù)名的優(yōu)先級要高。執(zhí)行代...
摘要:檢查當(dāng)前上下文中的參數(shù),建立該對象下的屬性與屬性值。檢查當(dāng)前上下文的函數(shù)聲明,也就是使用關(guān)鍵字聲明的函數(shù)。如果該變量名的屬性已經(jīng)存在,為了防止同名的函數(shù)被修改為,則會直接跳過,原屬性值不會被修改。 上一篇:《javascript高級程序設(shè)計》筆記:內(nèi)存與執(zhí)行環(huán)境showImg(https://segmentfault.com/img/bVY4xr?w=1146&h=374); 上篇文章...
摘要:在此,我們首先根據(jù)變量的作用域,將變量劃分為三級,具體是全局變量局部變量和參數(shù)變量。 【摘要】本文是專為JavaScript入門者而總結(jié)的,總體上將JavaScript的基礎(chǔ)部分分成了九大塊,分別是變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、字符串函數(shù)、函數(shù)基礎(chǔ)、DOM操作基礎(chǔ)、文檔對象模型DOM和正則表達(dá)式。 【關(guān)鍵字】變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、函數(shù)、DOM、正則表達(dá)式。 本篇文章的主...
摘要:先說下這個老話題連續(xù)賦值例結(jié)果是什么這句簡單,而這句呢答案是,變成了全局變量了這是實(shí)際執(zhí)行順序未使用聲明,所以變?nèi)肿兞苛死茉缫郧暗拿嬖囶}目了,相信很多人知道答案,考點(diǎn)詞法分析執(zhí)行順序運(yùn)算符優(yōu)先級等這是我理解的實(shí)際執(zhí)行順序我是這么猜想的自 先說下這個老話題:連續(xù)賦值 例1: function a(){ var o1 = o2 = 5; } a(); console.l...
摘要:在執(zhí)行上下文棧中,全局執(zhí)行上下文處于棧底,頂部為當(dāng)前的執(zhí)行上下文。可以把所有的程序執(zhí)行看作一個執(zhí)行上下文棧,棧的頂部是正在激活的上下文。 前言 ??本文內(nèi)容主要涵蓋了執(zhí)行上下文棧、執(zhí)行上下文、變量對象、函數(shù)變量提升等內(nèi)容。 ??眾所周知,JavaScript是單線程編程語言,同一時間只能做一件事情,程序執(zhí)行順序由上而下,程序的執(zhí)行主要依托JavaScript引擎,JavaScript引...
閱讀 3623·2021-11-24 10:22
閱讀 3692·2021-11-22 09:34
閱讀 2495·2021-11-15 11:39
閱讀 1534·2021-10-14 09:42
閱讀 3668·2021-10-08 10:04
閱讀 1562·2019-08-30 15:52
閱讀 851·2019-08-30 13:49
閱讀 3024·2019-08-30 11:21