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

 更新时间:2013年12月06日 09:10:11   作者:  
这篇文章主要介绍了JavaScript中的同名标识符优先级。需要的朋友可以过来参考下,希望对大家有所帮助

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

复制代码 代码如下:

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。



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

相关文章

  • web开发js字符串拼接占位符及conlose对象Api详解

    web开发js字符串拼接占位符及conlose对象Api详解

    本篇文章主要为大家介绍了web开发中字符串的拼接,占位符的使用以及conlose对象Api的使用,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • JavaScript 中栈的运用操作步骤

    JavaScript 中栈的运用操作步骤

    栈是一种强大的数据结构,在 JavaScript 中有许多实际应用,从表达式求值到函数调用栈,从图的遍历到括号匹配,栈都发挥了重要作用,这篇文章主要介绍了JavaScript中栈的运用,需要的朋友可以参考下
    2024-11-11
  • JavaScript递归函数解“汉诺塔”算法代码解析

    JavaScript递归函数解“汉诺塔”算法代码解析

    这篇文章主要介绍了JavaScript递归函数解“汉诺塔”算法代码解析,需要的朋友可以参考下
    2018-07-07
  • 合并多个ArrayBuffer场景及方法示例

    合并多个ArrayBuffer场景及方法示例

    这篇文章主要为大家介绍了合并多个ArrayBuffer方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 常用的js验证和数据处理总结

    常用的js验证和数据处理总结

    遇到需要对数据及表单验证的,我相信大家都像我一样,喜欢在网上找相关的方法,因为自己写的话,是比较耗时的。今天就给大家分享一下,自己在工作中总结的一些常用的js。
    2016-08-08
  • 初学js插入节点appendChild insertBefore使用方法

    初学js插入节点appendChild insertBefore使用方法

    由于可见insertBefore()方法的特性是在已有的子节点前面插入新的节点但是两种情况结合起来发现insertBefore()方法插入节点,是可以在子节点列表的任意位置。
    2011-07-07
  • 禁用backspace网页回退功能的实现代码

    禁用backspace网页回退功能的实现代码

    下面小编就为大家带来一篇禁用backspace网页回退功能的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • uniapp开发微信小程序自定义顶部导航栏功能实例

    uniapp开发微信小程序自定义顶部导航栏功能实例

    uni-app是一个使用Vue.js开发跨平台应用的前端框架,下面这篇文章主要给大家介绍了关于uniapp开发微信小程序自定义顶部导航栏功能的相关资料,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Javascript数组的 forEach 方法详细介绍

    Javascript数组的 forEach 方法详细介绍

    这篇文章主要介绍了Javascript数组的forEach方法详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 前端实现Excel文件导出功能的完整代码解析(vue实现excel文件导出)

    前端实现Excel文件导出功能的完整代码解析(vue实现excel文件导出)

    在Vue中实现导出Excel文件有多种方式,可以通过前端实现,也可以通过前后端配合实现,下面这篇文章主要给大家介绍了关于前端实现Excel文件导出功能(vue实现excel文件导出)的相关资料,需要的朋友可以参考下
    2024-05-05

最新评论