JavaScript中和C语言、Java这些语言不一样。在JavaScript当中,只存在函数作用域和全局作用域,而块级作用域是不存在的。刚刚接触JavaScript的话往往不知道这一点,所以很容易因为这一点在程序中出错。
作用域
JavaScript中作用域分为两种,分别是:
- 全局作用域
- 函数作用域
其中全局作用域指的是在一个.js
文件中的作用域。全局作用域往往包含了这些特点:
- 变量公有化
- 函数公有化
简而言之就是说全局作用域中的变量和函数在这个.js
都是公有的、可访问的。而函数作用域则比起它则范围相对狭小一些,特点为:
- 变量私有化
- 函数私有化
函数作用域当中的变量和函数都是私有的,任何对变量和函数的修改都只能在这个函数作用域内进行
提升
变量提升
由于我们上面所说的,JavaScript中没有块级作用域的存在,所以我们的每一个变量都是全局有效,或者是函数内有效。什么意思?我们先来看一下这段代码:
function gg(){
if(tag !== 'undefined'){
var tag = 'output!'
console.log(tag)
}
}
//输出: output!
上面这段代码看似不可能输出output!
,但是其实这里发生了变量提升
。由于块级作用域不存在,所以代码var tag = 'output!'
在运行时发生了如下的情况:
function gg(){
var tag
if(tag !== 'undefined'){
tag = 'output!'
console.log(tag)
}
}
//输出: output!
即变量tag
的定义会被提升
到作用域顶部,所以tag的初值为undefined
函数提升
和变量一样,函数也存在着提升
的情况,有两种声明函数的方式:
- 函数声明:
function gg(){
console.log('success')
}
- 函数表达式:
var gg = function(){
console.log('success')
}
其中只有函数声明能够被提升
到作用域顶部,而函数表达式这种形式声明的函数则不能被提升
console.log(f1) //输出 function f1(){}
console.log(f2) //输出 undefined
function f1(){}
var f2 = function(){}
总结
JavaScript中只有两种作用域:全局作用域和函数作用域。而因为这个原因,在代码中的的函数声明、变量声明都会被提升到作用域顶部
扫描下方的二维码或搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。