JavaScript中同名标识符优先级详解

开发 前端
本文详细解读JavaScript中同名标识符优先级,给初学者提供学习和帮助。

一,局部变量先使用后声明,不影响外部同名变量

  1. var x = 1; // --> 外部变量x  
  2. function fn(){  
  3.     alert(x);  // --> undefined 局部变量x先使用  
  4.     var x = 2; // 后声明且赋值  
  5. }  
  6. fn();  
  7. alert(x); // --> 1<br> 

第一点,函数fn内第一句输出x,x是在第二句才定义的。这在JS中是允许的,这里的允许是指不会出现语法错误程序可以运行。

但在其它语言如C,Java中却是不允许的。变量必须先声明后使用,如

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

Java中编译器会提示错误,程序无法运行。

第二点,函数fn内的局部变量x不会影响到外部的变量x。即fn内alert输出不是1,而是undefined。

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

  1. function fn(fn){  
  2.     alert(fn);  
  3. }  
  4. fn('hello'); // --> "hello" 

可以看到函数名和形参同名都是fn,输出的是字符串"hello",却不是函数fn的函数体(fn.toString())。

三,形参优先级高于arguments

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

arguments对象可以直接在函数内使用,是语言本身提供的一个 特殊标识符 。

这里刚好将形参声明成与其同名。输出可以看到是"hello"而非"[object Object]",即形参arguments覆盖了语言本身提供的真正的arguments。

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

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

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

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

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

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

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

  1. function fn(a){  
  2.     var aa = a;  
  3.     alert(a);  
  4. }  
  5. fn('hello'); 

暂不运行,猜测下结果。如果按照第五点:声明且赋值的局部变量优先级高于形参。那么a将是undefined。但实际上a是"hello",即右a是形参a,左a才是局部变量a。

JavaScript中同名标识符优先级

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

原文链接:http://www.cnblogs.com/snandy/archive/2011/03/11/1980399.html

【编辑推荐】

  1. 浅析JavaScript继承方式
  2. 浅析JavaScript的写类方式
  3. 如何编写高质量的Javascript代码
  4. 深入理解JavaScript的闭包特性
  5. JavaScript中大括号“{}”的多义性
责任编辑:陈贻新 来源: Snandy的博客
相关推荐

2010-09-01 14:10:36

CSS优先级

2009-08-12 13:07:13

C#运算符优先级

2009-09-23 10:41:10

对象标识符Hibernate

2012-02-08 14:01:18

HibernateJava

2009-08-26 14:01:18

C#标识符

2012-08-14 09:38:29

WAN优化

2021-04-06 10:45:18

React前端优先级

2017-04-21 12:30:45

AndroidAndroid O设备标识符

2024-04-23 14:13:38

开发配置文件

2023-08-08 08:28:03

消息消费端Spring

2022-12-23 09:41:14

优先级反转

2023-11-03 08:22:09

Android系统算法

2009-07-21 08:41:05

Scala操作符优先级

2023-05-28 00:09:21

2009-10-27 14:20:37

VB.NET动态标识符

2010-09-16 15:32:20

CSS选择器

2010-09-13 17:30:07

CSS优先级

2010-08-31 11:04:48

CSS优先级

2009-08-28 17:10:59

C#线程优先级

2022-07-17 06:57:02

时间戳唯一标识符
点赞
收藏

51CTO技术栈公众号