作用域
变量的作用域分为全局作用域
、局部作用域
和块级作用域
全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的
var count = 0
function fn(){
console.log(count);
}
fn()//result:0
局部作用域:
局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的
<script>
function fn(){
var count = 0
}
fn();
console.log(count)// count is not defined
块级作用域:
块作用域由 { } 包括
for(let i = 0; i < 10; i++){
console.log(i)
}
作用域链
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问
function fn1(){
var count = 0
console.log(count2) //count2 is not defined
function fn2(){
var count2 = 1
console.log(count)//fn2可以访问到count
}
}
闭包
闭包就是能够读取其他函数内部变量的函数
function fn (){
var count = 0
return function (){
console.log(count)
}
}
var fn2 = fn()
fn2() //result:0
作用1:隐藏变量,避免全局污染
作用2:可以读取函数内部的变量
缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗
缺点2:不恰当的使用闭包可能会造成内存泄漏的问题
this指向
fn.bind()、 fn.call() 、fn.apply()
他们都是改变this指向的方法 第一个参数都是this的指向
区别:
bind返回一个函数
call的参数是以散落的形式传递给函数
apply是以数组的形式传递参数
bind有返回值 返回值是调用bind方法的函数本身
call 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以散落的形式传递给函数作为实参
apply 没有返回值 他的第一个参数是要this的指向。第一个参数是谁,函数内部的this就指向谁其他参数以数组的形式传递给函数作为实参