博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
声明提升
阅读量:5295 次
发布时间:2019-06-14

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

我们知道,JavaScript语句在编译阶段会将所有函数和变量的声明进行提升,例如:

console.log(a);  // undefinedvar a=100;

输出是undefined,因为这个代码片段会被解析成:

var a;console.log(a); // undefineda=2;

变量a的声明会被提升到所在作用域(即全局作用域)的顶部,函数也不例外(注意,函数表达式是不会被提升的,只有函数声明才会被提升):

foo();     // 2function foo(){    console.log(2);}

这个代码片段会被解析成:

function foo(){    console.log(2);}foo();    // 2

那函数和变量哪个会被优先提升呢?来看一个例子:

foo();    // 2var foo;function foo(){    console.log(2);}foo=function(){    console.log(1);}

输出是2,实际上代码会被解析成:

function foo(){    console.log(2);}foo();  // 2foo=function(){    console.log(1);}

虽然foo函数的声明在var foo;之后,但由于函数被优先提升了,所以var foo;也就因为重复声明而被忽略。

注意,出现在后面的函数声明可能会覆盖前面的:

foo();  // 3functio foo(){    console.log(1);}var foo=function(){    console.log(2);};function foo(){    console.log(3);}

foo();执行结果是3。实际上代码会被解析成:

functio foo(){    console.log(1);}function foo(){    console.log(3);}foo();     // 3foo=function(){    console.log(2);};

声明会被提升到所在作用域的顶部,ES5不会像下面这样被条件语句所控制:

foo();   // 2if(true){    function foo(){        console.log(1);    }} else{    function foo(){         console.log(2);    }}

输出是2而不是1,实际上代码会被解析成:

function foo(){     console.log(1);}function foo(){     console.log(2);}foo();    // 2if(true){} else{}

第一个foo函数声明被第二个foo函数声明所覆盖,所以最终执行结果为2,因为尽管foo函数是在if-else语句块里被声明,但ES5没有块作用域(只有函数作用域),所以foo函数声明依然会被提升到全局作用域,就出现了刚才的情况。

转载于:https://www.cnblogs.com/linweinb/p/8288391.html

你可能感兴趣的文章
IO流 总结一
查看>>
素数筛选法
查看>>
php连接postgresql数据库
查看>>
Visual studio之C# 调用系统软键盘(外部"osk.exe")
查看>>
hdu 4506(数学,循环节+快速幂)
查看>>
Spring mvc 教程
查看>>
CentOS DesktopEntry
查看>>
基于python语言的自动化邮件发送总结
查看>>
TSQL点滴
查看>>
Selenium_Python接口-Alert类
查看>>
linux远程win7教程
查看>>
移动应用开发选型:向左还是向右?
查看>>
开发进度一
查看>>
十天冲刺(6)
查看>>
加载selenium2Library失败---robotframework环境搭建(site-packages下无selenium2library文件夹)...
查看>>
MyBaits学习
查看>>
实体标签,媒体标签,飘动标签
查看>>
MySQL安装的详细步骤
查看>>
Deformity JSP Webshell、Webshell Hidden Learning
查看>>
关于 Go2Shell (Go2Shell 可以在 Finder 中打开当前目录的终端窗口,是一个对开发者来说非常有用的App)...
查看>>