饥人谷技术博客JS 深入了解系列

一、深入之作用域(Scope)

2017-06-06  本文已影响0人  七_五

0x00、引言

在编程语言中,Scope控制着变量与参数的可见性及生命周期。对于写代码的我们而言也是一项重要的服务,它减少了名称冲突并提供了自动内存管理。
JavaScript中的作用域分为全局作用域和函数作用域两种

0x01、函数作用域

函数作用域: 即定义在函数中的参数和变量在函数外部是不可见的。而在函数内部位置定义的变量,在该函数内部任何地方都可见,千万注意不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!不要和块级作用域弄混淆了!

demo

  var foo = function {
    var a =3 , b=5;
    var bar = function(){
        var b = 7, c = 11   //此时a =3 ,b =7 ,c =11
        a += b + c;         //此时 a= 21,b = 7,c = 11
    };
    //bar()函数调用前:a =3,b=5,c为undefined
    bar();
    //bar()函数调用后:a = 21,b =5(若块级作用域,此刻a应该为3)
  }

0x02、ES6新增块级作用域

我们知道在大多数类C语言中都拥有块级作用域。通常在一个 代码块{....}中,定义的所有变量在代码块外部是不可见的;定义在代码块中的变量在代码块执行结束后会被释放掉,这是一个很优雅的特性。

demo

{
  let a = 7
  var b = 5
}
console.log(a)     // a is not defined
console.log(b)    // 5

出现上面的结果,是因为var定义的变量不受块级作用域的约束(这里可以看作全局变量),因此打印出b=5;而let是受的块级作用域约束的,在{...}中所有变量在代码块的外部不可见

下面我们来聊一下ES6中let和const的区别:其实简单的说,就是let主要是用来定义变量的,而const用于定于常量(定义时必须立即赋值,并不可被覆盖),当然它们同样在遵循块级作用域。

0x03、总结

其实我们需要重点注意的是函数作用域与块级作用域的区别,并且对函数作用域需要关注的是:内部函数可以自由访问定义它们的外部函数的参数和变量,这也为我们的闭包奠定了基础

上一篇下一篇

猜你喜欢

热点阅读