請見以下一個閉包示例:javascript
color = "red"; var obj = { color: "blue", getColor: function () { function displayColor() { return this.color; } return displayColor(); } } console.log(obj.getColor());
在getColor函數內部再定義了一個displayColor,再又定義了一個displayColor函數,從而造成閉包,最後將地上displayColor函數返回,這裏發現這樣定義其實做用不大,能夠使用匿名函數替代直接返回:前端
color = "red"; var obj = { color:"blue", getColor: function () { return function() { return this.color; } } } console.log(obj.getColor()()); //輸出 red
閉包中匿名函數和this對象java
在javascript 中this 對象是基於函數的執行環境綁定的:在全局函數中, this等於全局環境即 window (瀏覽器環境)或者globle(node中),而當函數做爲某個對象的方法調用時this等於該對象。不過匿名函數的執行環境具備全局性,其this 一般指向window(瀏覽器)或者globle(node環境),所以上面例子中,輸出的是全局對象的 color定義。node
爲何沒有得到閉包外面定義的blue呢?瀏覽器
如前文所述,函數被調用時,其活動對象會取得兩個特殊的變量,arguments和this,所以在搜索的時候在做用域鏈的最前端即當前活動對象中就查找到了,不會進一步向上層查找。不過咱們能夠把外部做用域的this對象保存在一個閉包可以訪問到的變量裏,這樣就可以訪問外層對象了:閉包
color = "red"; var obj = { color:"blue", getColor: function () { var self=this; return function() { return self.color; } } } console.log(obj.getColor()()); //輸出 blue
最後,看一道百度2015年 前端開發南京站筆試題:函數
var myObject = { foo: "bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); //輸出 bar console.log("outer func: self.foo = " + self.foo); //輸出 bar (function() { console.log("inner func: this.foo = " + this.foo); //輸出 undefined console.log("inner func: self.foo = " + self.foo); //輸出 bar }()); } }; myObject.func();
問,輸出結果是什麼? 相信如今應該比較好理解了。this