手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

变量的顺序

首页 > Javascript >

我是在一个博客上看到这个代码的。同时也理所当然的认为值是我想象中的那样,然而,现实无情的击破了我的幻想。。代码如下:

JavaScript代码
  1. var x = 1; 
  2. function fn(){  
  3.     alert(x);  
  4.     var x = 2; 
  5. }  
  6. fn();  
  7. alert(x);  

看到上面的代码,如果清楚全局变量和局部变量的或许都会说,输出1,1,但事实真是这样的吗?COPY出来到浏览器中运行一下,你会发现,第一次alert居然是undefined。。。这是为什么 ?真相呢?真相在哪时在???

让我们翻开这篇博客看一下。。。http://www.cnblogs.com/snandy/archive/2011/03/11/1980399.html ,作者的标题是JavaScript中同名标识符优先级

一,局部变量先使用后声明,不影响外部同名变量(代码略,就是我上面那一段 )

第一点,函数fn内第一句输出x,x是在第二句才定义的。这在JS中是允许的,这里的允许是指不会出现语法错误程序可以运行。
但在其它语言如C,Java中却是不允许的。变量必须先声明后使用,如

Java代码
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         System.out.println(x); // 先使用  
  4.         int x = 10// 后声明  
  5.     }  
  6. }  

Java中编译器会提示错误,程序无法运行。
第二点,函数fn内的局部变量x不会影响到外部的变量x。即fn内alert输出不是1,而是undefined。

二,形参优先级高于函数名

JavaScript代码
  1. function fn(fn){  
  2.     alert(fn);  
  3. }  
  4. fn('hello'); // --> "hello"  
可以看到函数名和形参同名都是fn,输出的是字符串"hello",却不是函数fn的函数体(fn.toString())。

三,形参优先级高于arguments

JavaScript代码
  1. function fn(arguments){  
  2.     alert(arguments);  
  3. }  
  4. fn('hello'); // --> "hello"<br>  

arguments对象可以直接在函数内使用,是语言本身提供的一个 特殊标识符
这里刚好将形参声明成与其同名。输出可以看到是"hello"而非"[object Object]",即形参arguments覆盖了语言本身提供的真正的arguments。

四,形参优先级高于只声明却未赋值的局部变量

JavaScript代码
  1. function fn(a){  
  2.     var a;  
  3.     alert(a);  
  4. }  
  5. fn('hello'); // --> "hello"  

函数fn形参为a,函数内第一句仅声明局部变量a,却并未赋值。从输出结果是"hello"而非undefined可以看出形参a优先级高于仅声明却未赋值的局部变量a。

五,声明且赋值的局部变量优先级高于形参

JavaScript代码
  1. function fn(a){  
  2.     var a = 1;  
  3.     alert(a);  
  4. }  
  5. fn('hello'); // --> "1"  

 

函数fn形参为a,函数内第一句仅声明局部变量a,赋值为1。从输出结果是"1"而非"hello"可以看出声明且赋值的局部变量a优先级高于形参a。

 

六,形参赋值给同名局部变量时

JavaScript代码
  1. function fn(a){  
  2.     var a = a;  
  3.     alert(a);  
  4. }  
  5. fn('hello');  
暂不运行,猜测下结果。如果按照第五点:声明且赋值的局部变量优先级高于形参。那么a将是undefined。但实际上a是"hello",即右a是形参a,左a才是局部变量a。

大小: 13.82 K
尺寸: 454 x 96
浏览: 1615 次
点击打开新窗口浏览全图

这里的两个a互不干扰,谁也没覆盖谁。这与刚刚说的赋值的局部变量优先级高于形参又矛盾了。但引擎这样做的确是我们想要的,因为并不希望var a = a后a是undefined。

---EOF---
看了上面的内容,你懂了多少?




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):