js基础-作用域 闭包
作用域
何为作用域
任何编程语言都有作用域的概念,简单来说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
js的作用域是靠函数来形成的,也就是说一个函数的变量在函数外不可以访问
1全局作用域
任何地方都能访问到的对象拥有全局作用域。
2局部作用域
局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方会把这种作用域成为函数作用域。
3ES6的块级作用域
ES5只有全局作用域和函数作用域,没有块级作用域,
闭包
提到作用域就不得不提到闭包,简单来讲,闭包外部函数能够读取内部函数的变量。
优点:闭包可以形成独立的空间,永久的保存局部变量。
缺点:保存中间值的状态缺点是容易造成内存泄漏,因为闭包中的局部变量永远不会被回收
this
不同的应用场景场景:
- 作为普通函数被调用
- 使用call apply bind 作为对象方法被调用
- 在class方法中调用 箭头函数
- this在场景中取什么样的值是由函数执行时确认的
手写bind函数
function fn1(a,b){
console.log(this) //x:100
console.log(a,b) //1,2
return "fn1"
}
// bind改变this指返回对象
const fn2 = fn1.bind({x:100},1,2)
//使用bind改变this后需要调用
const res = fn2
//模拟bind
Function.prototype.bind1=function(){
//将参数拆解为数组
const args =Array.prototype.slice.call(arguments)
//获取this(数组第一项)
const t =args.shift()
//fn1.bind()中的fn1
const self = this
//返回一个函数
return function(){
return self.apply(t,args)
}
}
const fn3 = fn1.bind1({x:100},1,2)
const ress = fn3()
console.log(res)