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

相關文章
相關標籤/搜索