函数作用域和块作用域

  1. 函数中的作用域

在函数中声明的变量你都可以在这个作用域的所有位置,以及当前函数所嵌套的子函数中访问的到,但是你无法在这个函数的外面访问的到。

function foo(){
  var [a,b,c] = [1,2,3]//es6知识,模式匹配
  function bar(){
    console.log(a,b,c);
  }
  bar()//1,2,3
}
foo()
console.log(a,b,c);//报错

这套设计是很有必要的让函数声明的变量具有单独的作用域,让变量不污染到全局变量上面,可以在多个函数中声明同名变量,而互不影响。

  1. 隐藏内部实现

  1. 在开发中我们应该将一些私有的方法单独抽离出来,而不是都一股脑的声明到全局作用域上,你可能会问为什么要抽离出来,举个例子如果说两个函数都用到了同名变量,作用却不同,这个时候是不是出错了。

  1. 当你需要引入多个第三方工具库如果,这个工具库没有遵循这个原则,那么会发现我们的全局作用域上面是非常的乱。

  1. es6的import export export default 模块化的实现就说明官方都推崇我们应用这一原则,将一个工具js分离为模块,用谁引入谁,减少代码体积。

  1. 匿名函数及函数表达式

  1. 匿名函数就是没有名字的函数functin关键字后面没有名字,使用匿名函数,会使调试变得十分麻烦,因为你不知该怎样去调用它,以及他自身如果是一个递归函数的话,你无法访问他本身,除非你使用arguments.callee,但它又从es5后及es5的严格模式删除了,匿名的函数也减少了代码的可读性,因为你没有看到这个函数的名字,也不知道这个函数到底干了什么。

  1. 函数表达式:函数表达式的产生是因为有的时候一个函数我们只需要执行一次,去让它进行初始化的操作,仅执行了一次,我们就创建了一个变量,污染到了全局作用域上面,这是不合理的。

(function(){
  console.log(123);
})()

上面就是函数表达式的写法,我们通过()将一个匿名函数封闭在了其中,另一个()是对其的调用,也可以将最后一个()放到匿名函数的后面去,两者都一样会去执行,还有一种情况,你在一个函数表达式中传递了一个函数作为参数,又在函数表达式中调用了:

(function(fn){
   fn()
})(
  function people(){
      console.log('走');
  }
)

在我看来这是一件脱裤子放屁多此一举的事情。

  1. 块作用域

  1. 常见的例子来说一个for循环和if就是一个块作用域:

for(var i = 0;i<10;i++){
}
console.log(i);
var flag = true
if(flag){
  var name = 'mike'
}
console.log(name);

声明的i在for循环内部()声明但是它却污染可全局变量,if语句也是一样name在{}中声明了,但是在if外部我仍然可以访问到它,这是不合理的,在es6的let之间if{}声明的变量和for循环()内声明的变量都回直接无视掉这个作用域将变量声明到了全局作用域上面去,let出来后我for循环声明的变量只能在循环的内部访问到,if语句也是一样,便于浏览器通过垃圾回收机制,去回收变量,提高性能。

  1. 小结

函数作用域是最常见的,在let出来之前没有块作用域这一概念,let出来后才具有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值