作用域和自由变量

1,作用域和自由变量

全局作用域
不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量
就是在最外层定义的变量就被称为全局变量,全局都可以使用,所以是全局作用域。

局部作用域
在函数内声明的变量具有函数作用域,属于局部变量,就是在函数内部定义的变量,
只在函数内部有用,所以是局部作用域。

Es6的定义的块级作用域
声明变量的方法 有var let const
var 声明的变量可以变量提升 变量提升是将变量的声明提升至当前作用域的最顶部,而变量的赋值不会提升
let/const声明的变量让当前代码块变成一个暂时性的死区
内部变量不能在外部使用 他们声明的变量不存在变量提升
区别: const声明的变量必须给默认值 const声明的是常量不能重新赋值
const声明的变量的值如果是引用数据类型 则数据内部的数据可以修改

自由变量
假如在全局中定义了变量a,在函数中使用了这个a,这个a就是自由变量,可以这样理解,凡是跨了自己的作用域的变量都叫自由变量。

闭包

概念:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数的内部变量,且返回的那个函数在外部被执行,就产生了闭包.

function a(){
   return function b(){
       
  }
}
a();

特性:
1.函数套函数
2.外部函数能够访问内部函数的变量以及参数
3.变量不会被垃圾回收机制回收(引用计数,标记清除)
优点:
1.变量一直在内存中
2.避免全局变量污染(防止内存泄露)
3.私有成员的存在
缺点:
1.不能及时释放内存
2.捕获的变量是引用,不是复制
3.父函数每调用一次,就产生一次闭包

改变this的指向

有三个方法能改变this指向,fn.bind()、 fn.call() 、fn.apply()
他们都是改变this指向的方法 第一个参数都是this的指向
区别:
	bind返回一个函数 
	call的参数是以散落的形式传递给函数
	apply是以数组的形式传递参数
	bind有返回值 返回值是调用bind方法的函数本身
	call 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以散落的形式传递给函数作为实参
	apply 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以数组的形式传递给函数作为实参

箭头函数与普通函数的区别

1:写法不一样
2:普通函数存在变量提升的现象
3:箭头函数不能作为构造函数使用
4:两者this的指向不同
5:箭头函数的arguments指向它的父级函数所在作用域的arguments
6:箭头函数没有new.target

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值