博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中的变量提升(hoisting)
阅读量:4886 次
发布时间:2019-06-11

本文共 1324 字,大约阅读时间需要 4 分钟。

来看如下代码:

function HelloJS(){    var array = [1,2,3,4,5];    for(var i in array){        }    alert(i);}HelloJS();alert(i);

  此段代码运行后先执行HelloJS();,会先输出4,然后再执行alert(i);,执行alert(i);时会报i is not defined的错误。

根据变量提升,这段代码等同于如下代码:

function HelloJS(){    var i;    var array = [1,2,3,4,5];    for(i in array){        }    alert(i);} HelloJS(); alert(i);

可见对应变量i的声明自动提升到了代码块的头部这里即函数的头部,即第一个alert可以正常执行。 

执行第二个alert(i)报错是因为:用var操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁。

 

JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。(只会提升变量的声明语句,不会提升变量的赋值语句,例如var a = 1;只会提升var a;将它放到代码块的头部,而a=1;语句照样在原来的位置)

示例:

console.log(a);var a =1;

以上语句并不会报错,只是提示undefined。实际运行过程:

var a;console.log(a);a =1;

表示变量a已声明,但还未赋值。但是变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

console.log(b);b =1;

以上代码将会报错:ReferenceError: b is not defined

与普通变量一样,js里的function也可看做变量,也存在变量提升情况:

abc();function abc(){    console.log(1); };

表面上,上面代码好像在声明之前就调用了函数abc。但是实际上,由于“变量提升”,函数abc定义部分被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错:

abc();var abc = function(){    console.log(1); }; // TypeError: abc is not a function

因为,实际运行过程:

var abc;abc();abc = function(){    console.log(1); };

这时候abc是个变量,并非function

函数声明可以被提前,如果是函数表达式则只有变量声明提前,函数体并不会提前。

 

转载于:https://www.cnblogs.com/zhangcybb/p/7019000.html

你可能感兴趣的文章
Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
查看>>
免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
查看>>
测试用例,变量之间,相互调用的方法,和修改原来初始化变量的方法
查看>>
Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)
查看>>
Palindrome Number
查看>>
PHP命名空间(Namespace)的使用详解
查看>>
java项目@override报错问题
查看>>
DataTable 和Json 字符串互转
查看>>
Redis安装 java中的连接 序列化 反序列化
查看>>
hdu 1896 优先队列的应用
查看>>
OpenGL 头文件,库文件
查看>>
点与不规则图形关系判断
查看>>
iOS 自定义控件--重写一些方法
查看>>
第二次冲刺作业
查看>>
【转】HTML, CSS和Javascript调试入门
查看>>
蓝桥历年试题 套娃
查看>>
微信支付体验
查看>>
Thinkphp 3.2笔记
查看>>
RHEL7开机不能正常进入系统(图形化界面)
查看>>
Android开发环境搭建完全图解
查看>>