javascript 闭包、this

 

闭包其实很好理解,可是因为常常把this和闭包绑在一块儿,从而加大了理解的难度,若是将他们分开考虑,那就清晰多了。es6

闭包

闭包并非js独创,在许多语言中都支持闭包,如schemer、ruby等。若是没有闭包,像js这样的支持高阶函数特性的语言将是一个噩梦。浏览器

  • 静态做用域
  • 动态做用域
var name = "xiaofu";
var person = function(lastname){
var name = 'yang';
 
function personName(){
return name + lastname;
}
return personName;
}
var pName = person();
pName( "xiaoming");

js是函数做用域的,即一个function就是一个做用域,因此personName在person这个函数的做用域里面。可是调用的是在这个做用域的外面,那么当personName执行的时候,它里面的name取的是person这个做用域仍是最外层的做用域呢?ruby

若是是静态做用域则调用的是person里面的 name, 若是是动态做用域则调用的是外层的name(“xiaofu”);而不是”yang”。闭包

而闭包就是用来实现静态做用域的一种方式,即经过闭包将函数和它声明时的做用域保存下来,这样在调用的时候取到的就是声明时所在的做用域而不是调用时的做用域。app

this

this则与变量有点不一样,即this采用的是相似于动态做用域的状况。js里面一切都是对象,因此函数也都是某个对象的方法,若是没有显示指定则是全局对象。函数

var person = {
fullname: function{
console.log(this);
},
printAge: function(){
console.log(this);
}
}
person.fullname(); //this指向person
var age = person.printAge;
age(); //this指向window(浏览器中)

将person.printAge赋值给age以后,再执行age(),此时age没有显示指定调用对象则默认是window(浏览器环境)。因此this并非声明所在的环境。post

箭头函数(es6)

es6中新增了箭头函数,箭头函数与经过function声明的函数不一样,它的this是使用的声明时上下文中的this.而且不可经过apply, call等改变。ui

相关文章
相关标签/搜索