JavaScript閉包中閉包函數this的指向


閱讀文章前, 請先閱讀阮一峰老師的這篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

前人寫過的, 而且寫得很好, 就沒必要重復下去了. 只加一些阮老師的文章里沒有說的.順便總結一下.

引用一句話: "閉包就是functions that return function"(出處已經忘記啦)

閉包的類型: 循環閉包, 函數閉包

閉包的特點: 外部訪問函數內部的值, 函數內部變量不被回收

函數閉包類型中閉包函數的this指向. 

考慮如下代碼: 

var name = "window";
        var object = {
            name : "object",
            getNameFunc : function(){
                return function(){
                    return this.name;
                };
            }
        };
        var obj = {
            name : "object",
            getNameFunc : object.getNameFunc()
        };
        function foo() {
            return this.name;
        }
        console.log(foo());//Window 
        console.log(object.getNameFunc()());  //Window 
        console.log(obj.getNameFunc()); //object

閉包函數無法直接訪問包含他的函數的this對象, 因為二者的this指向是不一樣的. 

外部函數的this指向調用他的對象, 內部函數的this指向了全局對象, 其實並不難理解.

類比以下兩個函數的調用

foo();//Window
object.getNameFunc()(); //Window

實際上, 當調用object.getNameFunc()時, 就像全局對象返回了一個函數, 返回的這個函數和foo函數其實並無兩樣.

在全局中調用這個返回的函數時, 函數的this自然就指向了全局對象, 就好像調用foo函數一樣.

而當object.getNameFunc()在obj內部時, 返回的閉包函數就成了obj 的屬性, 此時閉包函數的this就指向了obj對象.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM