首頁  >  文章  >  web前端  >  淺析JavaScript中的同名識別碼優先權_javascript技巧

淺析JavaScript中的同名識別碼優先權_javascript技巧

WBOY
WBOY原創
2016-05-16 17:10:311227瀏覽

一,局部變數先使用後聲明,不影響外部同名變數

複製程式碼


程式碼如下:


var x = 1; // --> 外在變數x
function fn(){
    alert(x);  // --> undefined 局部變數x先使用
    var x = 2; // 後宣告且賦值
}
fn(); alert(x); // --> 1


第一點,函數fn內第一句輸出x,x是在第二句才定義的。這在JS中是允許的,這裡的允許是指不會出現語法錯誤程式可以運行。 但在其它語言如C,Java中卻是不允許的。變數必須先宣告後使用,如
複製程式碼


程式碼如下:


public class Test {
    public static void main(String[] args) {
        System.out.println(x); // 先使用
    

Java中編譯器會提示錯誤,程式無法運作。

第二點,函數fn內的局部變數x不會影響到外部的變數x。即fn內alert輸出不是1,而是undefined。
二,形參優先權高於函數名稱

複製程式碼

複製程式碼


程式碼
>

function fn(fn){     alert(fn);

} fn('hello'); // --> "hello"

可以看到函數名稱和形參同名都是fn,輸出的是字串"hello",卻不是函數fn的函數體(fn.toString())。 三,形參優先權高於arguments

複製程式碼


程式碼:

程式碼:

function fn(arguments){     alert(arguments);
}
fn('hello'); // --> "hello"

四,形參優先級高於只聲明卻未賦值的局部變量





複製代碼

程式碼如下:

function fn(a){
    var a;
    alert(a);

五,宣告且賦值的局部變數優先權高於形參





複製程式碼

複製程式碼


程式碼如下:

function fn(a){     var a = 1;     alert(a); } fn('hello'); - -> "1"
函數fn形參為a,函數內第一句僅宣告局部變數a,賦值為1。從輸出結果是"1"而非"hello"可以看出宣告且賦值的局部變數a優先權高於形參a。


六,形參賦值給同名局部變數時


複製程式碼複製程式碼 程式碼如下>function fn(a){     var a = a;     alert(a); } fn('hello'); } fn('hello');
暫不運行,猜測下結果。若依照第五點:宣告且賦值的局部變數優先權高於形參。那麼a將是undefined。但實際上a是"hello",即右a是形參a,左a才是局部變數a。



這裡的兩個a互不干擾,誰也沒覆蓋誰。這與剛剛說的賦值的局部變數優先權高於形參又矛盾了。但引擎這樣做的確是我們想要的,因為並不希望var a = a後a是undefined。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn