摘要:這里留下一個問題,如果寫成這樣,你覺得可以么總之,真是一門奇異的語言
一 歷史
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
摘要:注意由于閉包會額外的附帶函數(shù)的作用域內(nèi)部匿名函數(shù)攜帶外部函數(shù)的作用域,因此,閉包會比其它函數(shù)多占用些內(nèi)存空間,過度的使用可能會導致內(nèi)存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發(fā)中經(jīng)常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...
摘要:權威指南第版中閉包的定義函數(shù)對象可以通過作用域鏈相互關聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi),這種特性在計算機科學文獻中成為閉包。循環(huán)中的閉包使用閉包時一種常見的錯誤情況是循環(huán)中的閉包,很多初學者都遇到了這個問題。 閉包簡介 閉包是JavaScript的重要特性,那么什么是閉包? 《JavaScript高級程序設計(第3版)》中閉包的定義: 閉包就是指有權訪問另一個函數(shù)中的變...
摘要:類型是提供的引用類型之一,通過可需變更創(chuàng)建對象。調(diào)用自身的函數(shù)被稱之為遞歸函數(shù)。想要解決上述遞歸函數(shù)的問題,可以使用對象屬性替換具體的函數(shù)名。保護貢獻的局部變量。 Function類型 概述 Function與函數(shù) 函數(shù)是這樣的一段JavaScript代碼,她只定義一次,但是可能被執(zhí)行或調(diào)用多次。Function類型是JavaScript提供的引用類型之一,通過Function可u需變...
閱讀 3411·2023-04-25 20:37
閱讀 3152·2021-09-07 09:59
閱讀 1675·2019-08-29 12:43
閱讀 1195·2019-08-28 18:27
閱讀 489·2019-08-26 13:50
閱讀 2041·2019-08-26 10:33
閱讀 3602·2019-08-23 18:39
閱讀 2411·2019-08-23 18:09