前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《你不知道的JavaScript》:作用域提升

《你不知道的JavaScript》:作用域提升

作者头像
前端_AWhile
发布2019-08-29 14:53:24
6030
发布2019-08-29 14:53:24
举报
文章被收录于专栏:前端一会前端一会

《你不知道的JavaScript》第一部分作用域和闭包第3篇。

前两篇主要讲作用域的查询机制和常见形式,本篇要讲的是作用域中的声明提升。

在全局作用域和局部作用域中,都存在声明提升的行为。

所谓声明,包括变量声明和函数声明。而声明提升,就是在作用域范围内,不管内部的变量与函数声明在何处,当执行到这个作用域时,引擎都会首先将当前作用域内的变量和函数声明放置到当前作用域顶端后,再按从上到下顺序执行其他代码。举例:

//1.js
a = 2;
var a;
console.log(a);     // 输出=> 2

//2.js
console.log(b);     //  输出=> undefined
var b = 2;

经过变量提升后,实际为:

//1.js
var a;  //将变量a声明提升到所在作用域顶端
a = 2;
console.log(a);     // 2

//2.js
var b;  //将变量b声明提升到所在作用域顶端
console.log(b);     // undefined
b = 2;

这里注意有个坑了:函数声明有提升行为,函数表达式不会有提升行为。

foo();      // 输出=> 1
function foo(){
    console.log(1);
}

fn();       //输出TypeError
bar();      // 输出ReferenceError
var fn = function bar(){
    console.log(2);
}

问个问题:为什么fn()调用会报TypeError错误呢? 因为此时的fn值为undefined,而对undefined调用方法,就会报TypeError错误。而使用为函数表达式添加的名称标识符bar进行方法调用时,输出的则是ReferenceError

另外还有个细节需要注意,在同时有变量声明和函数声明的提升行为中,引擎会执行函数优先的准则。即先提升函数,再提升变量。这再次证明果然js中函数是一等公民的地位。

最后总结下,js中的提升行为,面向的是对象是变量声明和函数声明,排除了包括函数表达式的赋值在内的赋值操作并不会提升。并且函数声明的优先级高于变量声明。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档