1、闭包
- 什么是闭包?
闭包就是可以访问另一个函数作用域中的变量的函数。
闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域。
通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止
- 创建闭包的常见方式
在一个函数内部创建另一个函数
function fun(){
var a = 1;
return function(){
return a;
}
}
var m = fun();
console.log(m()); // 1
外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象
- 闭包只能取得包含函数中任何变量的最后一个值
function fun(){
var arr = [];
for(var i=1;i<10;i++){
arr[i] = function(){
return i;
}
}
return arr;
}
arr数组中包含了10个匿名函数,每个匿名函数都能访问外部函数的变量i,i=10
- 闭包作用
创建私有变量和方法 避免全局污染
可以间接调用函数内部的局部变量。
可以让这些变量的值始终保持在内存中。(因此要注意不能滥用闭包)
2、箭头函数和普通函数的区别?
- this
箭头函数没有this,它的this是继承来的,默认指向定义它的时候的对象
普通函数指向的是它的直接调用者。没找到直接调用者,则this指向 window
let obj = {
a: 1,
b: () => {
console.log(this.a); // undefined
},
c: function() {
console.log(this.a); // 1
},
};
obj.b();
obj.c();
这里通过obj.b(),此时this指向的window对象,上面没有a,所以返回undefined。通过obj.c(),this指向的是它的直接调用者,就是obj,所以返回1。
- 箭头函数是匿名函数,不能作为构造函数,不能使用new
- 没有原型prototype
- 不可以使用arguments对象
网友评论