日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
匿名函數(shù)自執(zhí)行和閉包是一回事兒嗎?

一、匿名函數(shù)自執(zhí)行

概述

在javascript中,有些看起來很復(fù)雜卻又很好理解的東西,但是理解他們需要一定的技巧同時(shí)理解他們又非常的重要,了解了他們就給你打開了一扇門,讓你知其然還能夠知其所以然。因?yàn)樗麄兙o密結(jié)合,自成一體。今天我們來說說這些既簡單有重要的東西。

1.什么是函數(shù)表達(dá)式和函數(shù)聲明

 大家已經(jīng)知道函數(shù)就是特殊的對象,然后大家也了解函數(shù)聲明和函數(shù)表達(dá)式了。

 
 
 
 
  1. //函數(shù)聲明 
  2.         function show(){ 
  3.             console.log(12); 
  4.         } 
  5.          
  6.      //函數(shù)表達(dá)式 
  7.         var show = function(){ 
  8.             console.log(5); 
  9.         };    

2.看到函數(shù)表達(dá)式也沒啥奇怪的,因?yàn)楹瘮?shù)是對象,那把一個(gè)對象賦值給一個(gè)變量或者當(dāng)成參數(shù)傳遞都是可以的。

 
 
 
 
  1. //函數(shù)聲明 
  2.         function show(){ 
  3.             console.log(12); 
  4.         } 
  5.          
  6.      //函數(shù)表達(dá)式 
  7.         var show = function(){ 
  8.             console.log(5); 
  9.         };    

函數(shù)能像數(shù)字一樣賦值給變量傳遞給參數(shù)的現(xiàn)象就叫做 first-class function,沒啥難的吧。

3.說到了對象,我們就說下引用和復(fù)制的區(qū)別。

 
 
 
 
  1. var a = 12; 
  2. var b = a; 
  3. b+=5; 
  4. alert(a);//12 

這個(gè)沒啥好解釋的,b復(fù)制一份兒啊,b怎么改跟a無關(guān)。

 
 
 
 
  1. var arr1 = [12,5,8]; 
  2. var arr2 = arr1; 
  3. arr2.pop(); 
  4. alert(arr1);//12,5 

我擦嘞,發(fā)生了什么?

記住一句話,基本類型的復(fù)制是直接拷貝一份兒跟原來的無關(guān),而對象復(fù)制僅僅是把地址指向復(fù)制了一份兒。

我有一個(gè)饅頭,基本類型復(fù)制就相當(dāng)于照著我的饅頭又給你做一個(gè),吃了你的饅頭我手里的沒影響。

我有一把鑰匙,能開一個(gè)合租房的門,對象復(fù)制是引用,就是復(fù)制了一把鑰匙,你把廁所給拆了,我也得憋著。理解了不?

4.函數(shù)傳參這個(gè)我只是說一句,這個(gè)是很多開發(fā)者犯錯(cuò)的地方,這里不解釋我一解釋你上下都不明白了,只是告訴你就行。

訪問變量有按值和按引用兩種方式,但是參數(shù)只能是按值傳遞。

參數(shù)類型是基本類型時(shí),被傳遞的值被復(fù)制給一個(gè)局部變量,而復(fù)合類型復(fù)制的是地址。

好吧,直接上一個(gè)例子吧。慢慢領(lǐng)悟吧。

 
 
 
 
  1. function setName(obj){ 
  2.   obj.name = "尼古拉斯·屌·大彬哥" 
  3.   //重點(diǎn) 
  4.   obj = new Object(); 
  5.   obj.name = "帥彬" 
  6. var Person = new Object(); 
  7. setName(Person); 
  8. alert(Person.name); 

5.關(guān)于函數(shù)的this和arguments

js里面最惡心的東西,沒有之一。下面我說說函數(shù)里面的this。

 
 
 
 
  1. function show(){console.log(this);}//window 
  2. var show = function{console.log(this);}//window 

注意了,

 
 
 
 
  1. var person = { 
  2.         name:"leo", 
  3.         show:function(){ 
  4.             this.name = 'leolau';  
  5.             console.log(this);//person對象 object 
  6.         } 
  7. }; 

但是這里有個(gè)奇怪的事情,很多人認(rèn)為是bug,面試也經(jīng)???。

 
 
 
 
  1. var person = { 
  2.         name:"leo", 
  3.         show:function(){ 
  4.             this.name = 'leolau';  
  5.             console.log(this);//person對象 object 
  6.              var bug = function(){ 
  7.             console.log(this);//window 
  8.             } 
  9.             bug(); 
  10.         }    
  11. }; 

如何解決?

 
 
 
 
  1. var person = { 
  2.         name:"leo", 
  3.         show:function(){ 
  4.             var that = this; 
  5.             this.name = 'leolau';  
  6.             console.log(this);//person對象 object 
  7.              var bug = function(){ 
  8.             console.log(that);//person 
  9.             } 
  10.             bug(); 
  11.         }    
  12. }; 

至于arguments給大家一個(gè)實(shí)際應(yīng)用。未知參數(shù)個(gè)數(shù)不定求和。大家想想怎么做?

6.什么是匿名函數(shù)自執(zhí)行并如何在實(shí)際庫中應(yīng)用

匿名函數(shù)自執(zhí)行,注意,注意,只有這個(gè)名字和iife沒有其他名字,比如封閉空間,這個(gè)是為了讓大家好理解自己造的詞語。他的一個(gè)重要用途就是防止命名沖突,另外是組織和架構(gòu)庫,比如jquery。

命名沖突

 
 
 
 
  1. a.js 
  2. var a = 12; 
  3. b.js 
  4. var a = 5; 

同時(shí)引用a,b后面覆蓋前面了。怎么防止命名沖突前后覆蓋。

 
 
 
 
  1. var a = 12; 
  2. (function(){ 
  3.     var a = 5; 
  4. })(); 

這里iifes里面的a并不會(huì)干擾外面的a,那么問題來了,萬一我就想改外面的a,呢?

這也是很多jquery庫的做法,這么搞:

 
 
 
 
  1. (function(global,$){ 
  2.     $.a = 12; 
  3.     global.a = 5; 
  4.    
  5. })(window,jquery); 

既滿足了外面的修改,又做到了防止變量污染。

二、閉包

概述

經(jīng)常聽到閉包這個(gè)詞兒,或者匿名函數(shù)自執(zhí)行之類的。到底他們是一個(gè)東西嗎?

1.什么是閉包?

 我不想扣定義,直接上例子。

 
 
 
 
  1. function parent(firstname){ 
  2.   return function(lastname){ 
  3.   console.log(firstname+'·屌·'+lastname); 
  4.   } 
  5. parent('尼古拉斯')('大彬哥'); 

看圖:

函數(shù)執(zhí)行完以后會(huì)銷毀(這里我就不談堆棧操作了理解圖就行了),然后各種變量會(huì)垃圾回收,而這里parent函數(shù)確實(shí)銷毀了,但是firstName這個(gè)參數(shù)并沒有垃圾回收,釋放內(nèi)存,依然在內(nèi)存中能夠被return里面的函數(shù)使用,好像return里面的函數(shù)把父函數(shù)的那個(gè)資源給關(guān)閉在了自己的函數(shù)里面一樣,這個(gè)函數(shù)銷毀資源被關(guān)閉到子函數(shù)中依然能夠使用的現(xiàn)象叫做閉包。

注意匿名函數(shù)自執(zhí)行只是產(chǎn)生閉包的一種情況,閉包是現(xiàn)象或者情形,不實(shí)用匿名函數(shù)自執(zhí)行也有很多情況產(chǎn)生閉包,所以根本就是兩回事兒,不能混淆。

類比,在window系統(tǒng)中,你子文件夾中有使用的文件父文件夾是沒法刪除的。

2.實(shí)際應(yīng)用,情況很多,先來一道面試題。

 
 
 
 
  1. function fn{ 
  2.             var arr = []; 
  3.             for(var i = 0;i<3;i++){ 
  4.                 arr.push(function(){ 
  5.                     console.log(i); 
  6.                 }); 
  7.             } 
  8.             return arr; 
  9.         } 
  10.         var arrFn = fn(); 
  11.         arrFn[0]();//3 
  12.         arrFn[1]();//3 
  13.         arrFn[2]();//3 

與這個(gè)類似的一個(gè)題是循環(huán)里面用事件,事件里面的i有問題,如下。

 
 
 
 
  1. for(var i = 0;i
  2.     aBtn[i].onclick = function(){ 
  3.         alert(i);//3 
  4.     }; 

還有一到非常愛考的面試題:

 
 
 
 
  1. for(var i = 0;i<3;i++){ 
  2.     setTimeout(function(){ 
  3.         alert(i); 
  4.     }); 

我只分析一個(gè),其它的大家就會(huì)分析了。注意表象上粗略的理解就是 函數(shù)執(zhí)行一瞬間,并不會(huì)等定時(shí)器,但是這個(gè)說法并不對,因?yàn)?**個(gè)就說不通。下面我們進(jìn)入內(nèi)部深入分析下過程。

記住一句話,函數(shù)定義壓入arr的時(shí)候并沒有執(zhí)行。

小測驗(yàn),你能看出下面的程序用了閉包嗎?

 
 
 
 
  1. function show(){ 
  2.     var a = 12; 
  3.     setTimeout(function(){ 
  4.         console.log(a); 
  5.     },1000); 

3.閉包在jquery中使用。

閉包無處不在,直接看jquery的例子。

 
 
 
 
  1. $('#btn').click(function(){ 
  2.     var json = {}; 
  3.     ajax(url,function(data){ 
  4.         json =dada; 
  5.     }); 
  6.      
  7. }); 

【本文為專欄作者“面包理想學(xué)院”的原創(chuàng)稿件,轉(zhuǎn)載請通過聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文


文章名稱:匿名函數(shù)自執(zhí)行和閉包是一回事兒嗎?
網(wǎng)址分享:http://www.5511xx.com/article/dhjhcoh.html