变量的提升是分作用域的,变量的搜索原则
来源:互联网 发布:nginx反向代理 到端口 编辑:程序博客网 时间:2024/05/16 18:56
先来看下变量的提升规则
1.JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作
2.变量和函数同名
在提升的时候,如果有变量和函数同名,会忽略掉变量,只提升函数
3. 函数同名,如何提升
预处理的时候,会将两个函数全部提升,但是后面的函数会覆盖掉前面函数
如下代码
console.log(a);//undefined var a = 123; var num = 456; function test(){ console.log(num); var num = 10; } test();//undefined
两个打印结果均为undefined,让我们来看下实际提升后的代码
var a;console.log(a);a = 123var num;num = 456; function test(){ var num; console.log(num); num = 10; }test();
提升后的代码可以看出,在js中执行顺序是从上往下执行,而打印语句在打印的时候会在本身所在作用域里找。而在test()函数中,打印语句调用时 有var num语句 num还没有赋值,所以打印结果为undefined。
在全局中用var 声明变量相当于把变量提升为全局变量。
var num = 456; function f1() { console.log(num); num = 10; } f1();//打印结果为456 console.log(num);//打印结果为10
打印结果分别为456和10,让我们来看下实际提升后的代码
var num; function f1(){ console.log(num); num = 10; } num = 456; f1(); console.log(num);
不难看出,还是那个道理JS从上往下执行代码,函数f1不调用时,不执行。当调用f1时会去自身函数作用域中找num,这是在函数作用域中并没有定义num,所以去上一作用域找,这时在全局中把num赋值为456,所以打印456,调用函数后,num赋值为10,所以再次打印出来值变成了10。
有的人可能会有疑惑,第一个例子里面调用test函数后为什么不去全局中找,是因为在test中已经用var定义了num,所以找到了num但没赋值,所以打印undefined。而在第二个例子中,f1函数中没有用var定义,所以要去全局找num。
变量的搜索原则
1.在使用变量的时候 首先在所在的作用域中查找 如果找到了 就直接使用 如果没有找到 就去上级作用域中查找 2.重复以上步骤 如果直到0级作用域链也就是全局作用域还没有找到,报错
阅读全文
0 0
- 变量的提升是分作用域的,变量的搜索原则
- 作用域 变量的提升
- 变量的作用域和变量提升
- javaScript的作用域和变量提升
- javascript的变量提升和作用域
- JavaScript的作用域和变量提升
- ES6 变量作用域与提升:变量的生命周期详解
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- 变量的作用域
- leetcode_11. Container With Most Water ? 待解决
- 在python代码中输出一个字符的unicode编码
- python3和python2的区别
- SQL的join链接之inner join和full join
- 转载 csdn 博客
- 变量的提升是分作用域的,变量的搜索原则
- HDU
- access 中使用sql切分查询 客户时刻群之前的记录
- 五子棋
- 数据分析之《菜鸟侦探挑战数据分析》-4-文本挖掘
- Gulp 笔记
- 算法爱好者——链表划分 ? 待解决
- T-shirt buying Codeforce 贪心
- 快速排序