js 匿名函式 閉包前奏

2022-09-10 15:24:18 字數 1370 閱讀 5491

js裡面」萬物皆物件「,函式同理

三種定義方式

a.傳統的如同c語言一樣的定義方式:function abc()

b.少見的定義方式:var abc = new function('引數','**');  //由此可見我們的function是建構函式function的物件例項,即函式也是物件 

c.匿名函式定義:var abc = function() //寫乙個匿名函式,並讓乙個變數稱為它的引用

對於匿名函式有很多奇技淫巧:

1.若是我們平時用a,b方法定義函式,實際呼叫的時候需在函式名後+()並寫入引數,如abc(),abc(a)..這基礎、淺顯但是重要

2.直接用匿名函式不賦值,(function(...))(實參);

3.也就是你平常寫個匿名函式function(){}它是不會執行的,它只相當於乙個函式名

4.然後來了一堆亂七八糟的寫法是和2等效的

~(function())(); //返回-1

void function()();  //返回undefined

+/- function()(); //返回nan

~function()(); //返回-1

!function()(); //返回true

(function()()); //undefinded

你不知道哪些混蛋會突然這樣寫**,尤其在閉包問題上,見識過總是好的

閉包前奏

有個例子被人舉爛了

但是我們有大多碰到過這種情況,至少我碰到過

for(var i=1;i<=5;i++),i*1000);

這樣會輸出5次"6"

然後很基本大家都知道

for(var i=1;i<=5;i++))(i),i*1000);

就好了,

會依次輸出各位數字

然後很多人說:「這就是閉包」

wtf?這真的是閉包?

和之前我們對匿名函式的認識

就足夠解釋這一現象了,不需要閉包知識

由於alert是延遲執行的,按照第一種寫法,哪怕只有1000ms,i已經變成6了

按照第二種寫法會得到我們預期的效果是因為

在這個匿名函式後面加了(),

相當於在往settimeout裡放fallback函式時,

就執行了一次匿名函式

i是primitive value

函式傳參的形式把當時的i值複製了份傳了進去

這和閉包並沒有太大的關係

拋開學術用語,我個人目前淺表的理解是這樣

「如果乙個func 裡面的 innerfunc 被作為返回值」

則稱之為閉包

這樣func裡面的環境及變數會被一直保留在記憶體之中

關於閉包,作為前奏先敘述到這裡

將會在正篇繼續研究和討論

js 閉包和匿名函式

前面學了這麼多知識,今天就來看看匿名函式和閉包吧!想要學習閉包先來看看什麼是匿名函式吧!一 匿名函式 匿名函式就是沒有名字的函式。他有兩種宣告方式 1.典型的函式宣告 function functionname arg0,arg1,arg2 2.函式表示式 var functionname func...

js 關於閉包和匿名函式

關於js閉包。之前我一直以為是匿名函式,以為封閉式的建立即執行銷毀就是閉包,其實這是匿名函式,不一樣的。也沒有閉包的使用經驗。後來去網上查了下才知道,閉包的意思是 函式內部還有函式,返回乙個函式,內部函式可訪問外部函式的變數。乙個最簡單的案例 a是外部函式,b是內部函式,b可以使用a的變數i,呼叫a...

匿名函式與閉包

function box alert box leefunction var box function alert box lee function var box function alert box leealert function function age 100 函式裡面放匿名函式 形成閉...