成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript匿名函數(shù)以及在循環(huán)中的匿名函數(shù)

dreamtecher / 1957人閱讀

摘要:這里留下一個問題,如果寫成這樣,你覺得可以么總之,真是一門奇異的語言

一 歷史

JavaScript其實是一門奇異的語言,TA的一大特性是沒有塊級作用域

for(var i=0;i<10;i++){

}
console.log(i)

大家猜測下值是多少?
答案是 10, 雖然我們在一個塊內(nèi)申明了變量,但i卻是在全范圍內(nèi)起作用的,所以就引入了匿名函數(shù)

function(){
   var i=0;
   ...
}

以函數(shù)的作用域來限定變量作用域

二 立即執(zhí)行匿名函數(shù)

當然,還立即執(zhí)行的匿名函數(shù)

(function(){
   do sth.....
})()

第一次看到感覺真tm古怪,還tm要這樣寫,太tm古怪了,我們可以這樣看:
定義一個虛擬變量 var foo = function(){...}
然后foo要執(zhí)行,所以就

foo() = (function(){
       do sth.....
    })()

好了,匿名函數(shù)就立即執(zhí)行了

三 循環(huán)中的匿名函數(shù)

大家看下面一段代碼

function foo(){
    var arr = [];
    for(var i =0;i<5;i++){
      arr[i] = function(){
        //console.log(i) 來看看什么時候運行
        return i;   //定義函數(shù)時i的值并沒有初始化,指向函數(shù)外的i,因此,當匿名函數(shù)運行時,這個值就指向最大的i了
   }
  }
  return arr;
}

var a = foo();   //arr的賦值沒有被執(zhí)行
for (var i = 0; i< 5 ;i++){
  alert(a[i]());
}

有興趣的不妨運行一下,答案是5個5,發(fā)生什么事了呢?
我們在對arr賦值的時候:

 arr[i] = function(){
            return i;  
       }

函數(shù)里面的i是沒有分配具體的值的,它指向了最外層的i,而運行時才會賦值,所以,它就是最大的5了,再看一個例子

var arr = document.getElementsByTagName("p");
            for(var i = 0; i < arr.length;i++){
                arr[i].onclick = function(){
                    alert(i);
                }
            }

這是一個DOM的onclick事件,當點擊的時想能夠彈出不同的i值,實際上是無法實現(xiàn)的,所以,必須使用匿名函數(shù)的立即執(zhí)行來限定作用域

var arr = document.getElementsByTagName("p");
                for(var i = 0; i < arr.length;i++){
                    (function(j){
                        arr[j].onclick = function(){
                            alert(j);
                        }
                    })(i)
                }
                
        
四 循環(huán)中的異步函數(shù)

這樣一段代碼

for(var i=0;i

這里i會是最大值,為何呢?因為這是一個異步函數(shù),而非同步立即返回的函數(shù),此時由于js奇怪的單線程機制,會待同步全部結束后再運行異步的代碼,所以i始終是最大值,那么要用什么方法解決呢?是的,加一個閉包。

這里留下一個問題,如果寫成這樣,你覺得可以么

for(var i=0;i

總之,js真是一門奇異的語言

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/83706.html

相關文章

  • 深入javascript——作用域和閉包

    摘要:注意由于閉包會額外的附帶函數(shù)的作用域內(nèi)部匿名函數(shù)攜帶外部函數(shù)的作用域,因此,閉包會比其它函數(shù)多占用些內(nèi)存空間,過度的使用可能會導致內(nèi)存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發(fā)中經(jīng)常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...

    oogh 評論0 收藏0
  • JavaScript中的閉包

    摘要:權威指南第版中閉包的定義函數(shù)對象可以通過作用域鏈相互關聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi),這種特性在計算機科學文獻中成為閉包。循環(huán)中的閉包使用閉包時一種常見的錯誤情況是循環(huán)中的閉包,很多初學者都遇到了這個問題。 閉包簡介 閉包是JavaScript的重要特性,那么什么是閉包? 《JavaScript高級程序設計(第3版)》中閉包的定義: 閉包就是指有權訪問另一個函數(shù)中的變...

    Donne 評論0 收藏0
  • 深入理解閉包的概念

    摘要:離開閉包的泥淖,給這個例子一個較為合理的寫法總結理解閉包的概念是重要的,但我們不應當過多的使用閉包,它有優(yōu)點,也優(yōu)缺點,是一把雙刃劍。 閉包 關于閉包,目前有如下說法: 閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合(MDN) 函數(shù)對象可以通過作用域鏈相互關聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)。這種特性在計算機科學文獻中被稱為閉包(JavaScript權威指南) 閉包,指的是詞...

    anyway 評論0 收藏0
  • 簡述Function類型

    摘要:類型是提供的引用類型之一,通過可需變更創(chuàng)建對象。調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。想要解決上述遞歸函數(shù)的問題,可以使用對象屬性替換具體的函數(shù)名。保護貢獻的局部變量。 Function類型 概述 Function與函數(shù) 函數(shù)是這樣的一段JavaScript代碼,她只定義一次,但是可能被執(zhí)行或調(diào)用多次。Function類型是JavaScript提供的引用類型之一,通過Function可u需變...

    ityouknow 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<