浅析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 MD4
Dec 20 Javascript
编写高性能的JavaScript 脚本的加载与执行
Apr 19 Javascript
jquery 操作表格实现代码(多种操作打包)
Mar 20 Javascript
有关JavaScript的10个怪癖和秘密分享
Aug 28 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
Dec 14 Javascript
JS如何实现文本框随文本的长度而增长
Jul 30 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
Bootstrap 按钮样式与使用代码详解
Dec 09 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
php 判断数组是几维数组
2013/03/20 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
python模块restful使用方法实例
2013/12/10 Python
python中stdout输出不缓存的设置方法
2014/05/29 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python内置函数dir详解
2015/04/14 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
wxPython之解决闪烁的问题
2018/01/15 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
打架检讨书100字
2014/01/08 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
秋天的雨教学反思
2014/04/27 职场文书
年终晚会活动方案
2014/08/21 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
2015年社区工作总结
2015/04/08 职场文书
离婚被告答辩状
2015/05/22 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS