第一點,函數fn內第一句輸出x,x是在第二句才定義的。這在js中是容許的,這裏的容許是指不會出現語法錯誤程序能夠運行。
但在其它語言如C,Java中倒是不容許的。變量必選先聲明後使用,如:javascript
Java中編譯器會提示錯誤,程序沒法運行。
第二點,函數fn內的局部變量x不會影響到外部的變量x。即fn內alert輸出不是1,而是undefined。
順便提下,這段代碼常常出如今前端面試題中。前端
能夠看到函數名和形參同名都是fn,輸出的是字符串"hello",卻不是函數fn的函數體(fn.toString())。java
arguments對象能夠直接在函數內使用,是語言自己提供的標識符。
這裏恰好將形參聲明成與其同名。輸出能夠看到是"hello"而非"[object Object]",即形參arguments覆蓋了語言自己提供的真正的arguments。面試
函數fn形參爲a,函數內第一句僅聲明局部變量a,卻並未賦值。從輸出結果是"hello"而非undefined能夠看出形參a優先級高於僅聲明卻未賦值的局部變量a。app
函數fn形參爲a,函數內第一句僅聲明局部變量a,賦值爲1。從輸出結果是"1"而非"hello"能夠看出聲明且賦值的局部變量a優先級高於形參a。函數
暫不運行,猜想下結果。若是按照第五點:聲明且賦值的局部變量優先級高於形參。那麼a將是undefined。但實際上a是"hello",即右a是形參a,左a纔是局部變量a。spa
這裏的兩個a互不干擾,誰也沒覆蓋誰。這與剛剛說的賦值的局部變量優先級高於形參又矛盾了。但引擎這樣作的確是咱們想要的,由於並不但願var a = a後a是undefined。對象