JavaScript中同名标识符优先级

发布于 2022-09-08 17:07:19 字数 3835 浏览 8 评论 0

转:Snandy

JavaScript中同名标识符优先级





一,局部变量先使用后声明,不影响外部同名变量
  1. 1 var x = 1; // --> 外部变量x  

  2. 2 function fn(){  

  3. 3     alert(x);  // --> undefined 局部变量x先使用  

  4. 4     var x = 2; // 后声明且赋值  

  5. 5 }  

  6. 6 fn();  

  7. 7 alert(x); // --> 1<BR>
复制代码第一点,函数fn内第一句输出x,x是在第二句才定义的。这在JS中是允许的,这里的允许是指不会出现语法错误程序可以运行。
但在其它语言如C,Java中却是不允许的。变量必须先声明后使用,如
  1. 1 public class Test {  

  2. 2     public static void main(String[] args) {  

  3. 3         System.out.println(x); // 先使用  

  4. 4         int x = 10; // 后声明  

  5. 5     }  

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



二,形参优先级高于函数名
  1. 1 function fn(fn){  

  2. 2     alert(fn);  

  3. 3 }  

  4. 4 fn('hello'); // --> "hello"
复制代码可以看到函数名和形参同名都是fn,输出的是字符串"hello",却不是函数fn的函数体(fn.toString())。



三,形参优先级高于arguments
  1. 1 function fn(arguments){  

  2. 2     alert(arguments);  

  3. 3 }  

  4. 4 fn('hello'); // --> "hello"<BR>
复制代码arguments对象可以直接在函数内使用,是语言本身提供的一个 特殊标识符 。
这里刚好将形参声明成与其同名。输出可以看到是"hello"而非"[object Object]",即形参arguments覆盖了语言本身提供的真正的arguments。



四,形参优先级高于只声明却未赋值的局部变量
  1. 1 function fn(a){  

  2. 2     var a;  

  3. 3     alert(a);  

  4. 4 }  

  5. 5 fn('hello'); // --> "hello"
复制代码函数fn形参为a,函数内第一句仅声明局部变量a,却并未赋值。从输出结果是"hello"而非undefined可以看出形参a优先级高于仅声明却未赋值的局部变量a。



五,声明且赋值的局部变量优先级高于形参
  1. 1 function fn(a){  

  2. 2     var a = 1;  

  3. 3     alert(a);  

  4. 4 }  

  5. 5 fn('hello'); // --> "1"
复制代码函数fn形参为a,函数内第一句仅声明局部变量a,赋值为1。从输出结果是"1"而非"hello"可以看出声明且赋值的局部变量a优先级高于形参a。



六,形参赋值给同名局部变量时
  1. 1 function fn(a){  

  2. 2     var a = a;  

  3. 3     alert(a);  

  4. 4 }  

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

1.png (13.82 KB, 下载次数: 3)

下载附件

2011-03-11 11:14 上传



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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文