淺析JavaScript中的同名標(biāo)識(shí)符優(yōu)先級(jí)
一,局部變量先使用后聲明,不影響外部同名變量
var x = 1; // --> 外部變量x
function fn(){
alert(x); // --> undefined 局部變量x先使用
var x = 2; // 后聲明且賦值
}
fn();
alert(x); // --> 1<BR>
第一點(diǎn),函數(shù)fn內(nèi)第一句輸出x,x是在第二句才定義的。這在JS中是允許的,這里的允許是指不會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤程序可以運(yùn)行。
但在其它語(yǔ)言如C,Java中卻是不允許的。變量必須先聲明后使用,如
public class Test {
public static void main(String[] args) {
System.out.println(x); // 先使用
int x = 10; // 后聲明
}
}
Java中編譯器會(huì)提示錯(cuò)誤,程序無(wú)法運(yùn)行。
第二點(diǎn),函數(shù)fn內(nèi)的局部變量x不會(huì)影響到外部的變量x。即fn內(nèi)alert輸出不是1,而是undefined。
二,形參優(yōu)先級(jí)高于函數(shù)名
function fn(fn){
alert(fn);
}
fn('hello'); // --> "hello"
可以看到函數(shù)名和形參同名都是fn,輸出的是字符串"hello",卻不是函數(shù)fn的函數(shù)體(fn.toString())。
三,形參優(yōu)先級(jí)高于arguments
function fn(arguments){
alert(arguments);
}
fn('hello'); // --> "hello"<BR>
arguments對(duì)象可以直接在函數(shù)內(nèi)使用,是語(yǔ)言本身提供的一個(gè) 特殊標(biāo)識(shí)符 。
這里剛好將形參聲明成與其同名。輸出可以看到是"hello"而非"[object Object]",即形參arguments覆蓋了語(yǔ)言本身提供的真正的arguments。
四,形參優(yōu)先級(jí)高于只聲明卻未賦值的局部變量
function fn(a){
var a;
alert(a);
}
fn('hello'); // --> "hello"
函數(shù)fn形參為a,函數(shù)內(nèi)第一句僅聲明局部變量a,卻并未賦值。從輸出結(jié)果是"hello"而非undefined可以看出形參a優(yōu)先級(jí)高于僅聲明卻未賦值的局部變量a。
五,聲明且賦值的局部變量?jī)?yōu)先級(jí)高于形參
function fn(a){
var a = 1;
alert(a);
}
fn('hello'); // --> "1"
函數(shù)fn形參為a,函數(shù)內(nèi)第一句僅聲明局部變量a,賦值為1。從輸出結(jié)果是"1"而非"hello"可以看出聲明且賦值的局部變量a優(yōu)先級(jí)高于形參a。
六,形參賦值給同名局部變量時(shí)
function fn(a){
var a = a;
alert(a);
}
fn('hello');
暫不運(yùn)行,猜測(cè)下結(jié)果。如果按照第五點(diǎn):聲明且賦值的局部變量?jī)?yōu)先級(jí)高于形參。那么a將是undefined。但實(shí)際上a是"hello",即右a是形參a,左a才是局部變量a。

這里的兩個(gè)a互不干擾,誰(shuí)也沒(méi)覆蓋誰(shuí)。這與剛剛說(shuō)的賦值的局部變量?jī)?yōu)先級(jí)高于形參又矛盾了。但引擎這樣做的確是我們想要的,因?yàn)椴⒉幌M鹶ar a = a后a是undefined。
- js利用與或運(yùn)算符優(yōu)先級(jí)實(shí)現(xiàn)if else條件判斷表達(dá)式
- 淺談JS運(yùn)算符&&和|| 及其優(yōu)先級(jí)
- 淺談JavaScript中運(yùn)算符的優(yōu)先級(jí)
- Javascript算符的優(yōu)先級(jí)介紹
- JavaScript定義變量和變量?jī)?yōu)先級(jí)問(wèn)題探討
- JS前端知識(shí)點(diǎn) 運(yùn)算符優(yōu)先級(jí),URL編碼與解碼,String,Math,arguments操作整理總結(jié)
- JS正則表達(dá)式大全(整理詳細(xì)且實(shí)用)
- JS運(yùn)算符優(yōu)先級(jí)與表達(dá)式示例詳解
相關(guān)文章
web開(kāi)發(fā)js字符串拼接占位符及conlose對(duì)象Api詳解
本篇文章主要為大家介紹了web開(kāi)發(fā)中字符串的拼接,占位符的使用以及conlose對(duì)象Api的使用,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析
這篇文章主要介紹了JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析,需要的朋友可以參考下2018-07-07
合并多個(gè)ArrayBuffer場(chǎng)景及方法示例
這篇文章主要為大家介紹了合并多個(gè)ArrayBuffer方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
常用的js驗(yàn)證和數(shù)據(jù)處理總結(jié)
遇到需要對(duì)數(shù)據(jù)及表單驗(yàn)證的,我相信大家都像我一樣,喜歡在網(wǎng)上找相關(guān)的方法,因?yàn)樽约簩?xiě)的話,是比較耗時(shí)的。今天就給大家分享一下,自己在工作中總結(jié)的一些常用的js。2016-08-08
初學(xué)js插入節(jié)點(diǎn)appendChild insertBefore使用方法
由于可見(jiàn)insertBefore()方法的特性是在已有的子節(jié)點(diǎn)前面插入新的節(jié)點(diǎn)但是兩種情況結(jié)合起來(lái)發(fā)現(xiàn)insertBefore()方法插入節(jié)點(diǎn),是可以在子節(jié)點(diǎn)列表的任意位置。2011-07-07
禁用backspace網(wǎng)頁(yè)回退功能的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇禁用backspace網(wǎng)頁(yè)回退功能的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
uniapp開(kāi)發(fā)微信小程序自定義頂部導(dǎo)航欄功能實(shí)例
uni-app是一個(gè)使用Vue.js開(kāi)發(fā)跨平臺(tái)應(yīng)用的前端框架,下面這篇文章主要給大家介紹了關(guān)于uniapp開(kāi)發(fā)微信小程序自定義頂部導(dǎo)航欄功能的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Javascript數(shù)組的?forEach?方法詳細(xì)介紹
這篇文章主要介紹了Javascript數(shù)組的forEach方法詳細(xì)介紹,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
前端實(shí)現(xiàn)Excel文件導(dǎo)出功能的完整代碼解析(vue實(shí)現(xiàn)excel文件導(dǎo)出)
在Vue中實(shí)現(xiàn)導(dǎo)出Excel文件有多種方式,可以通過(guò)前端實(shí)現(xiàn),也可以通過(guò)前后端配合實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)Excel文件導(dǎo)出功能(vue實(shí)現(xiàn)excel文件導(dǎo)出)的相關(guān)資料,需要的朋友可以參考下2024-05-05

