天天看點

js函數--閉包和this對象

閉包

閉包是指有權通路另一個函數作用域中的變量的函數。

閉包隻取到包含函數中任何變量的最後一個值,如下所示:

function createFunctions() {
    var result = new Array();
    for(var i = ; i< ; i++){
        result[i] = function() {
            return i;
        }
    }
    return result;
}
           

這個函數會傳回一個函數數組,每個函數傳回的都是10;可以通過建立另一個匿名函數實作函數數組傳回他們的索引值:

function createFunctions() {
    var result = new Array();
    for(var i = ; i< ; i++) {
        result[i] = function(num) {
            return function() {
                return num;
            }
        }(i);
    }
    return result;
}
           

關于this對象

this對象是在運作時基于函數的執行環境綁定的:在全局變量中,this等于window,當函數被作為某個對象方法調用時,this等于那個對象。然而匿名函數具有全局性,是以this對象也指向window。

var name = "The window";
var object = {
    name : "My Object",
    getNameFunc: function() {
        return function() {
            return this.name;
        }
    }
};
alert(object.getNameFunc()()); //The window
           

如果想通路object的對象,可以把this儲存在閉包可以通路的變量中:

var name = "The window";
var object = {
    name : "My Object",
    getNameFunc: function() {
        var that = this;
        return function() {
            return that.name;
        }
    }
};
           

有些情況下this的值會發生改變:

var name = "The window";
var object = {
    name: "My Object",
    getName: function() {
        return  this.name;
    }
}

object.getName(); //"My Object"
(object.getName)(); //"My Object"
(object.getName==object.getName)() // "The window"
           

(object.getName==object.getName)()

這個先執行了一條指派語句,然後調用指派後的結果,因為這個指派表達式的值是函數本身,是以this的值得不到維持。

繼續閱讀