浅析JavaScript中的同名标识符优先级


Posted in Javascript onDecember 06, 2013

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

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

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

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

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

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

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

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

function fn(fn){ 
    alert(fn); 
} 
fn('hello'); // --> "hello"

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

三,形参优先级高于arguments

function fn(arguments){ 
    alert(arguments); 
} 
fn('hello'); // --> "hello"<BR>

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

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

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

function fn(a){ 
    var a; 
    alert(a); 
} 
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。

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

function fn(a){ 
    var a = a; 
    alert(a); 
} 
fn('hello');

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

浅析JavaScript中的同名标识符优先级

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

Javascript 相关文章推荐
Javascript String.replace的妙用
Sep 08 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
javascript中call,apply,bind函数用法示例
Dec 19 Javascript
纯js仿淘宝京东商品放大镜功能
Mar 02 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
详解Javascript中new()到底做了些什么?
Mar 29 Javascript
vue中进行微博分享的实例讲解
Oct 14 Javascript
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
如何判断元素是否为HTMLElement元素
Dec 06 #Javascript
随鼠标上下滚动的jquery代码
Dec 05 #Javascript
js简单实现删除记录时的提示效果
Dec 05 #Javascript
Jquery 切换不同图片示例代码
Dec 05 #Javascript
jquery 快速回到页首的方法
Dec 05 #Javascript
JS验证邮箱格式是否正确的代码
Dec 05 #Javascript
javascript eval(func())使用示例
Dec 05 #Javascript
You might like
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
python文件和目录操作函数小结
2014/07/11 Python
python字符串对其居中显示的方法
2015/07/11 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
商务日语毕业生自荐信范文
2013/11/14 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
初中家长寄语
2014/04/02 职场文书
法人代表授权委托书
2014/04/08 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
吴仁宝观后感
2015/06/09 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
《三国志》赏析
2019/08/27 职场文书