在函數內部有兩個特殊對象:arguments和this,this的指向實際上是很是靈活的,它會根據調用function的對象不一樣,致使了this的指向不一樣。當在全局做用域下調用函數時,this指向window。例如:javascript
window.color = 'red'; var o = {color: 'blue'}; function sayColor(){ alert(this.color); } sayColor(); //'red' o.sayColor = sayColor; o.sayColor(); //'blue'
咱們知道this對象在執行時是基於函數的執行環境綁定的:當函數被做爲某個對象的方法調用時,this指向那個對象。但匿名函數的執行環境具備全局性,因此this指向window。但在閉包中,這一點可能不太明顯。先說一下閉包吧,個人理解是在一個函數內部建立另外一個函數,而內部函數能夠訪問外部函數做用域中的變量,這是由於內部函數的做用域鏈中包含外部函數的做用域。java
var name = 'the window'; var object = { name: 'My object', getFunc: function (){ return function(){ return this.name; } } }; alert(object.getFunc()()); //'the window'
看到這裏,你們可能會驚訝,爲何this指向的是全局做用域。由於內部函數在搜索this和arguments時,只會搜索到其活動對象,永遠不可能直接訪問外部函數中的這兩個變量。閉包
爲了讓閉包內的this能訪問到外部做用域中的變量,咱們能夠在定義匿名函數以前把this附一個值,當定義閉包後就能夠訪問外部變量了。由於它是咱們在外部函數(包含函數)中特地聲明的一個變量。函數
var name = 'the window'; var object = { name: 'My object', getFunc: function (){ var that = this; return function(){ return that.name; } } }; alert(object.getFunc()()); //'My object'