【js】javascript变量声明优先级
2015-09-16 20:30
459 查看
javascript的作用域和hoisting,在里面我也提到了
这代码等效于:
这短短的代码里面其实说明了两个问题:
function声明的优先级高于var声明:第一个alert输出可以看出
赋值优先于函数声明:第二个alert输出可以看出
把一个变量添加到作用域中除有很多方法,如下:
javascript语言预定义的,比如说this,arguments
我们来看看他们之间的优先级:
对比以下:
对比如下:
这也正好印证了作用域链查找变量的方式:在局部作用域里查找(若找到则返回,不必往下继续查找) ==> 在上一级作用域里查找... ==> 直到全局作用域(若找不到则返回typeError)
最后看看下面的综合例子:
function声明的优先级比
var声明高,也就意味着当两个同名变量同时被
function和
var声明时,
function声明会覆盖
var声明,如下:
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(){};
我们来看看他们之间的优先级:
var声明并赋值优先级高于
function声明这个上面已经说了。
function声明优先级高于
formal parameter
function fnTest(a){ alert(a); function a(){return "我优先"} } fnTest(100);//:function a(){return "我优先"}。可以看出function声明覆盖了`formal parameter`。
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
formal parameter优先级高于
var声明不赋值
function fnTest(a){ alert(a); var a; } fnTest(100);//:100。很明显,不多说
预定义变量优先级高于
var声明不赋值
function fnTest(){ alert(arguments); var arguments; } fnTest();//:[Object Arguments]。不是undefined,说明arguments没有被var声明覆盖
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);
相关文章推荐
- Java,JSP,JavaScript三和差异
- js cookie操作
- session的生命周期
- 迷你MVVM框架 avalonjs1.5.2 发布
- JVM调优总结 + jstat 分析
- 解析JSON数据(二)
- 解决js 在onkeydown事件按键停顿问题
- jsp中四个作用域的区别
- JS中showModalDialog 详细使用
- Code Conventions for the JavaScript Programming Language
- 移动web最简洁的滑动效果Swipe JS(适合初学者)
- JSP中的9大内置对象
- 【js】javascript作用域
- JS打乱数组最高效的方法
- JavaScript(内置对象)
- Loadrunner发送json串请求
- js ajax请求
- js 自己常用的小小技巧(持续更新)
- JS方法
- js实现两数之前加减乘除操作