91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript中閉包與立即執行函數的使用案例

發布時間:2020-12-05 14:15:09 來源:億速云 閱讀:213 作者:小新 欄目:web開發

這篇文章主要介紹javascript中閉包與立即執行函數的使用案例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

作用域鏈的這種配置機制引出了一個值得注意的副作用,即閉包只能取得包含任何變量的最后一個值。

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

這個函數會返回一個函數數組。表面上看,似乎每個函數都應該返回自己的索引值,即位置0的函數返回0,位置1的函數返回1, 以此類推。

但實際上,每個函數都返回10,因為每個函數的作用域中都保存著createArray的活動對象,所以他們引用的都是同一個變量i。

當createArray()函數返回后,變量i的值是10,此時每個函數都引用著同一個變量i,所以i的值是10。

// 代碼執行過程

createArray();

/*
createArray() {
    var result = new Array();

    var i; // 0,1,2,3,4,5,6,7,8,9,10

    for ( i = 0; i < 10 ; i ++) {
        result[i] = function() {
            return i; 
            // 注意 函數的執行時機,你只有調用函數的時候,才會產生執行環境,沿著作用域鏈,找到活動對象
            // 這里有個閉包,還記得閉包的概念嗎? 有權訪問到另外一個函數作用域的變量的函數
        }
    }
    
    /*
    result[0] = function(){
        return i
    }
    result[1] = function(){
        return i
    }
    result[2] = function(){
        return i
    }
    ....
    */
    return result;
}

result = [function(){return i}, function(){return i}....];

*/

createArray()[1](); // 10

那么如何讓這個函數的行為符合我們的預期呢?

可以通過創建另一個匿名函數強制讓閉包的行為符合預期,這里也應用了立即執行函數。

//立即執行函數
//我們平時寫函數然后調用是這么寫的。
//聲明函數,調用執行。

function foo(){
    console.log("hi");
}

foo(); // "hi"

//那么,我們可不可以聲明調用寫一塊呢? 這就是申明函數立刻執行。
//好像不可以,控制臺報錯

function foo(){
    console.log("hi");
}(); //Uncaught SyntaxError: Unexpected token )


//那么如果用括號包裹呢?

(function foo(){
    console.log("hi");
}()); // "hi", 可以了。 這就是立即執行函數!

有了立即執行函數,就可以強制讓閉包的行為符合我們的預期了。

//改寫代碼
function createArray() {

    var result = new Array();

    for( var i = 0; i < 10; i ++ ) {
        result[i] = (function(i) { 
            return function(){
                return i;
            }
        }(i));
    }
    return result;
}
createArray()[0](); // 0
createArray()[1](); // 1
createArray()[2](); // 2 
// 這里不只有一種方法,其他方法在此不表。

以上是“javascript中閉包與立即執行函數的使用案例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云梦县| 伊通| 平乡县| 三穗县| 墨竹工卡县| 格尔木市| 贵州省| 昌邑市| 于都县| 托里县| 远安县| 张掖市| 黔江区| 房产| 宜丰县| 临西县| 黄石市| 湘西| 雷波县| 仲巴县| 都江堰市| 澄城县| 蒲城县| 增城市| 项城市| 新巴尔虎左旗| 黔江区| 光泽县| 朔州市| 泊头市| 志丹县| 湛江市| 彰化县| 安乡县| 阳原县| 朝阳区| 紫阳县| 朝阳市| 石城县| 贵州省| 壤塘县|