淺析JavaScript中的同名標識符優先順序_javascript技巧

來源:互聯網
上載者:User

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

複製代碼 代碼如下:

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

第一點,函數fn內第一句輸出x,x是在第二句才定義的。這在JS中是允許的,這裡的允許是指不會出現語法錯誤程式可以運行。

但在其它語言如C,Java中卻是不允許的。變數必須先聲明後使用,如

複製代碼 代碼如下:

public class Test {
    public static void main(String[] args) {
        System.out.println(x); // 先使用
        int x = 10; // 後聲明
    }
}

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"<BR>

arguments對象可以直接在函數內使用,是語言本身提供的一個 特殊標識符 。

這裡剛好將形參聲明成與其同名。輸出可以看到是"hello"而非"[object Object]",即形參arguments覆蓋了語言本身提供的真正的arguments。

四,形參優先順序高於只聲明卻未賦值的局部變數

複製代碼 代碼如下:

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

函數fn形參為a,函數內第一句僅聲明局部變數a,卻並未賦值。從輸出結果是"hello"而非undefined可以看出形參a優先順序高於僅聲明卻未賦值的局部變數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');

暫不運行,猜測下結果。如果按照第五點:聲明且賦值的局部變數優先順序高於形參。那麼a將是undefined。但實際上a是"hello",即右a是形參a,左a才是局部變數a。



這裡的兩個a互不干擾,誰也沒覆蓋誰。這與剛剛說的賦值的局部變數優先順序高於形參又矛盾了。但引擎這樣做的確是我們想要的,因為並不希望var a = a後a是undefined。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.