【js】javascript变量声明优先级
来源:互联网 发布:任务计划 软件 编辑:程序博客网 时间:2024/04/29 14:00
javascript的作用域和hoisting,在里面我也提到了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);
0 0
- 【js】javascript变量声明优先级
- JavaScript函数声明、变量声明及赋值的优先级问题
- Javascript 函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值
- js(javascript)小谈变量声明(显隐声明,声明提前)
- js(javascript)小谈变量声明(显隐声明,声明提前)
- js(javascript)小谈变量声明(显隐声明,声明提前)
- JavaScript的数据类型和变量声明以及js的语句
- JavaScript变量声明相关
- Javascript变量声明技巧
- JavaScript变量声明
- JavaScript 变量声明
- javascript变量声明提升
- 重新声明 JavaScript 变量
- javascript变量之声明
- javascript变量声明提升
- javascript变量声明
- JavaScript变量的声明
- JavaScript变量声明提升
- C++Primer第五版 10.2.3节练习
- linux crontab 定时执行计划命令
- 挂载,卸载,读,关
- (莫比乌斯模板abcd区间)
- C语言实现Huffman树并计算带权路径长度
- 【js】javascript变量声明优先级
- Linux关于IP的操作
- C++语言里const修饰符和指针前后位置的作用、区别详解
- 屏幕适配-文件夹命名
- 欢迎使用CSDN-markdown编辑器
- Java 序列化的高级认识
- java笔记——初学面向对象08匿名内部类
- linux关于文件共享
- iOS——UI学习笔记(3)