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