目录
1.JavaScript闭包
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。—引自MDN
在JS中,通俗来讲,闭包就是能够读取外层函数内部变量的函数。
变量的作用域为两种:全局作用域和局部作用域
1)函数内部可以读取全局变量
let code = 200;
function f1() {
console.log(code);
}
f1(); // 200
2)函数外部无法读取函数内部的局部变量
function f1() {
let code = 200;
function f2() {
console.log(code);
}
}
1)闭包概念
闭包访问的变量,是每次运行上层函数时重新创建的,是相互独立的。
function f1() {
let obj = {};
function f2() {
return obj;
}
return f2;
}
let result1 = f1();
let result2 = f1();
console.log(result1() === result2()); // false
不同的闭包,可以共享上层函数中的局部变量
function f() {
let num = 0;
function f1() {
console.log(++num);
}
function f2() {
console.log(++num);
}
return {f1,
f2};
}
let result = f();
result.f1(); // 1
result.f2(); // 2
旅行者走路的问题
function factory() {
var start = 0
function walk(step) {
var new_total = start + step
start = new_total
return start
}
return walk
}
var res = factory()
res(1)
res(2)
res(3)
2)闭包的注意点
1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值
2. this
1) 关键点
this始终指向调用该函数的对象;
若没有指明调用的对象,则顺着作用域链向上查找,最顶层为global(window)对象;
箭头函数中的this是定义函数时绑定的,与执行上下文有关
简单对象(非函数、非类)没有执行上下文;
类中的this,始终指向该实例对象;
箭头函数体内的this对象,就是定义该函数时所在的作用域指向的对象,而不是使用时所在的作用域指向的对象。