JavaScript之闭包
JavaScript作用域:全局作用域、局部作用域(块级作用域)形成的作用域链。
JavaScript变量:全局变量、局部变量。
函数内部可以读取全局作用域下的变量,全局作用域下不能读取到函数内部声明的变量。
要想从函数外部读取到函数局部变量就要使用到闭包知识:
在函数中定义一个子函数(可以访问到父层的变量),并返回该子函数作为函数调用值,这样在函数外就能读取到父函数中声明的变量
function count(){
var num = 0;
return function(){
num += 1;
console.log(num);
}
}
var total = count();
total();// 1
total();// 2
闭包可以理解为定义在函数中的子函数,将局部作用域和全局作用域链接的一种方式
使用闭包后局部变量num在函数调用结束后不会清除回收,会保存在内存中,如果程序中过度使用闭包会造成内存消耗大,影响程序性能,在IE浏览器中会导致内存泄露问题,可以在闭包函数调用结束后,将函数置为null,清除内存
一个闭包结合this指针的示例:
var name = 'hello world';
var obj = {
name: 'personal',
getName: function(){
return function(){
console.log(this.name);
}
}
};
var say = obj.getName();// say为返回的匿名函数,此时say为全局变量,this指定调用它的作用域为window,所以调用say指向window.name
say();// hello world
var name = 'hello world';
var obj = {
name: 'personal',
getName: function(){
const that = this;// 改变this的指向
return function(){
console.log(that.name);
}
}
};
var say = obj.getName();
say();// personal
将this赋给了that,在getName调用时,this指向的是调用它的对象obj,所以访问that.name时读取的是obj.name