JavaScript中和C语言、Java这些语言不一样。在JavaScript当中,只存在函数作用域全局作用域,而块级作用域是不存在的。刚刚接触JavaScript的话往往不知道这一点,所以很容易因为这一点在程序中出错。

作用域

JavaScript中作用域分为两种,分别是:

  1. 全局作用域
  2. 函数作用域

其中全局作用域指的是在一个.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

函数提升

和变量一样,函数也存在着提升的情况,有两种声明函数的方式:

  1. 函数声明:
function gg(){
    console.log('success')
}
  1. 函数表达式:
var gg = function(){
    console.log('success')
}

其中只有函数声明能够被提升到作用域顶部,而函数表达式这种形式声明的函数则不能被提升

console.log(f1) //输出 function f1(){}
console.log(f2) //输出 undefined
function f1(){}
var f2 = function(){}

总结

JavaScript中只有两种作用域:全局作用域函数作用域。而因为这个原因,在代码中的的函数声明、变量声明都会被提升到作用域顶部

扫描下方的二维码或搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。


tonychen
1.2k 声望272 粉丝

« 上一篇
闭包