1.作用域

作用域

什么是作用域
程序语言设定的一些规则,比如哪些地方可以读取一些变量,哪些地方可以修改变量这个规则我们管它叫作用域.
作用域的分类
从js角度分析有以下四个:
1.全局作用域
2.函数作用域
3.块状作用域
4.动态作用域
下面我们了解一下各个作用域的区别,ES6新增的let,const都是块状作用域,所以我们着重了解块状作用域.
1.全局作用域
字面意思都可以理解,既然是全局,我们就是希望在js中的任何地方都能拿到这个变量.这个变量就是全局变量,它拥有的作用域就是全局作用域.
通过var定义在函数外部全局变量, 如果没有通过var定义的话,他是保存在window对象的属性中的,var定义的变量不可以删除(delete xxx),而没有通过var定义的全局变量可以删除(delete),他看上去是个全局变量,实际上是和window有关系,应为window对象是全局变量.没有通过var定义的变量不管是在函数内部还是函数外部都挂载在window对象下.
2.函数作用域
也称局部作用域,屏蔽在函数内部的变量所在的作用域是函数作用域

function test(){
 var a = 3;
 return a+4;
}
console.log(test());//正常输出7
console.log(a);//出错变量a未定义

3.块作用域
是在函数内部的某一个代码逻辑块的作用域.

function test(){
  var a = 3;
  if(a===3){
    var b = 4;
    console.log('abc');
  }else{
    console.log('abcd');
  }
  console.log(b);//这个b是可以打印出来的
  return a+4;
}

以上代码在块里面定义的变量但是在块外面还可以取到.如果想只是在块内部定义变量,外面取不到,这样的话在ES6之前是做不到的.因为引擎会做变量提升.
这个时候ES6就引入了let,如果使用let定义变量的话,就只是在块内部起作用,外部就会失效了.
4.动态作用域
需要引入一个概念 this

window.a = 3;
function test(){
  console.log(this.a);//this是动态指向的,不是固定指向window,
}
test();//调用这个方法时输出的是3
test.bind({a:100})();//调用这个方法时输出是100

以上在函数内部都是this,但是他的指向不同,这个就是动态作用域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值