资讯专栏INFORMATION COLUMN

javascript同名属性优先级

sanyang / 1362人阅读

摘要:赋值优先于函数声明第二个输出可以看出我是变量又把覆盖掉了。优先级高于预定义变量。不是,说明没有被声明覆盖声明不赋值优先级高于函数外部作用域的其他所有声明。

我们先来看看下面的例子:


alert(a);//输出:function a(){ alert("我是函数") } function a(){ alert("我是函数") }// var a = "我是变量"; alert(a); //输出:"我是变量"

这代码等效于:


function a(){alert("我是函数")} var a; //hoisting alert(a); //输出:function a(){ alert("我是函数") } a = "我是变量";//赋值 alert(a); //输出:"我是变量"

这短短的代码里面其实说明了两个问题:

function声明的优先级高于var声明:第一个alert输出可以看出var a;function a(){}覆盖掉了。

赋值优先于函数声明:第二个alert输出可以看出a="我是变量"又把function a(){}覆盖掉了。

把一个变量添加到作用域中除有很多方法,如下:

javascript语言预定义的,比如说this,arguments

formal parameter(也就是中文说的形参吧)

var声明并赋值,比如说var a = 10;

var声明不赋值,比如说var a;

function声明,比如说function a(){};

我们来看看他们之间的优先级:

1.var声明并赋值优先级高于function声明
这个上面已经说了。

2.function声明优先级高于formal parameter

function fnTest(a){
    alert(a);
    function a(){return "我优先"}
}
fnTest(100);//:function a(){return "我优先"}。可以看出function声明覆盖了`formal parameter`。

3.formal parameter优先级高于预定义变量

function fnTest(arguments){
    alert(arguments);
}
fnTest(100);//:100。说明`formal parameter`优先级比预定义的arguments高

对比以下:

function fnTest(a){
    alert(arguments);
}
fnTest(100);//:[Object Arguments] {0:100,length:1}。当没有冲突时输出便是预定义的arguments

4.formal parameter优先级高于var声明不赋值

function fnTest(a){
    alert(a);
    var a;
}
fnTest(100);//:100。很明显,不多说

5.预定义变量优先级高于 var声明不赋值

function fnTest(){
    alert(arguments);
    var arguments;
}
fnTest();//:[Object Arguments]。不是undefined,说明arguments没有被var声明覆盖

6.var声明不赋值优先级高于函数外部作用域的其他所有声明

function fnTest(){
    alert(fnTest);
    var fnTest;
}
fnTest();//:undefined。

对比如下:

function fnTest(){    //
    alert(fnTest);    //    
}    //
fnTest();    //输出function fnTest(){alert(fnTest);}

这也正好印证了作用域链查找变量的方式:在局部作用域里查找(若找到则返回,不必往下继续查找) ==> 在上一级作用域里查找... ==> 直到全局作用域(若找不到则返回typeError)

最后看看下面的综合例子:

function fnTest(arguments){//
    alert(arguments);//function arguments(){return "hello world"}
    var arguments = 99;//
    function arguments(){return "hello world"};
    alert(arguments);//99
}
fnTest(100);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87627.html

相关文章

  • JavaScript基础系列---执行环境与作用域链

    摘要:延长作用域链下面两种语句可以在作用域链的前端临时增加一个变量对象以延长作用域链, 问题 今天看笔记发现自己之前记了一个关于同名标识符优先级的内容,具体是下面这样的: 形参优先级高于当前函数名,低于内部函数名 形参优先级高于arguments 形参优先级高于只声明却未赋值的局部变量,但是低于声明且赋值的局部变量 函数和变量都会声明提升,函数名和变量名同名时,函数名的优先级要高。执行代...

    J4ck_Chan 评论0 收藏0
  • javascript高级程序设计》笔记:变量对象与预解析

    摘要:检查当前上下文中的参数,建立该对象下的属性与属性值。检查当前上下文的函数声明,也就是使用关键字声明的函数。如果该变量名的属性已经存在,为了防止同名的函数被修改为,则会直接跳过,原属性值不会被修改。 上一篇:《javascript高级程序设计》笔记:内存与执行环境showImg(https://segmentfault.com/img/bVY4xr?w=1146&h=374); 上篇文章...

    tyheist 评论0 收藏0
  • JavaScript知识架构学习路径(一)- 变量篇

    摘要:在此,我们首先根据变量的作用域,将变量划分为三级,具体是全局变量局部变量和参数变量。 【摘要】本文是专为JavaScript入门者而总结的,总体上将JavaScript的基础部分分成了九大块,分别是变量、运算符、数组、流程控制结构、字符串函数、函数基础、DOM操作基础、文档对象模型DOM和正则表达式。 【关键字】变量、运算符、数组、流程控制结构、函数、DOM、正则表达式。 本篇文章的主...

    toddmark 评论0 收藏0
  • 从连续赋值到:词法分析、函数执行原理

    摘要:先说下这个老话题连续赋值例结果是什么这句简单,而这句呢答案是,变成了全局变量了这是实际执行顺序未使用声明,所以变全局变量了例很早以前的面试题目了,相信很多人知道答案,考点词法分析执行顺序运算符优先级等这是我理解的实际执行顺序我是这么猜想的自 先说下这个老话题:连续赋值 例1: function a(){ var o1 = o2 = 5; } a(); console.l...

    rose 评论0 收藏0
  • JavaScript:上下文相关

    摘要:在执行上下文栈中,全局执行上下文处于栈底,顶部为当前的执行上下文。可以把所有的程序执行看作一个执行上下文栈,栈的顶部是正在激活的上下文。 前言   本文内容主要涵盖了执行上下文栈、执行上下文、变量对象、函数变量提升等内容。   众所周知,JavaScript是单线程编程语言,同一时间只能做一件事情,程序执行顺序由上而下,程序的执行主要依托JavaScript引擎,JavaScript引...

    Michael_Ding 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<