免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1830 | 回复: 2
打印 上一主题 下一主题

写了10年Javascript未必全了解的标识符顺序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-16 14:56 |只看该作者 |倒序浏览
from  zhouyrt

一,局部变量先使用后声明,不影响外部同名变量
  1. var x = 1; // --> 外部变量x
  2. function fn(){
  3.         alert(x);  // --> undefined 局部变量x先使用
  4.         var x = 2; // 后声明且赋值
  5. }
  6. fn();
  7. alert(x); // --> 1
复制代码
第一点,函数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.         }
  6. }
复制代码
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"
复制代码
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。


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

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


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


六,了解了以上几点,再看一个有趣的代码

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


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

论坛徽章:
0
2 [报告]
发表于 2010-11-18 09:05 |只看该作者
很基础的知识,学习了

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2010-11-24 10:18 |只看该作者
这个和JAVA没有太大关系啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP