摘要:這里留下一個問題,如果寫成這樣,你覺得可以么總之,真是一門奇異的語言
一 歷史
JavaScript其實是一門奇異的語言,TA的一大特性是沒有塊級作用域
for(var i=0;i<10;i++){ } console.log(i)
大家猜測下值是多少?
答案是 10, 雖然我們在一個塊內申明了變量,但i卻是在全范圍內起作用的,所以就引入了匿名函數
function(){ var i=0; ... }
以函數的作用域來限定變量作用域
二 立即執行匿名函數當然,還立即執行的匿名函數
(function(){ do sth..... })()
第一次看到感覺真tm古怪,還tm要這樣寫,太tm古怪了,我們可以這樣看:
定義一個虛擬變量 var foo = function(){...}
然后foo要執行,所以就
foo() = (function(){ do sth..... })()
好了,匿名函數就立即執行了
三 循環中的匿名函數大家看下面一段代碼
function foo(){ var arr = []; for(var i =0;i<5;i++){ arr[i] = function(){ //console.log(i) 來看看什么時候運行 return i; //定義函數時i的值并沒有初始化,指向函數外的i,因此,當匿名函數運行時,這個值就指向最大的i了 } } return arr; } var a = foo(); //arr的賦值沒有被執行 for (var i = 0; i< 5 ;i++){ alert(a[i]()); }
有興趣的不妨運行一下,答案是5個5,發生什么事了呢?
我們在對arr賦值的時候:
arr[i] = function(){ return i; }
函數里面的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值,實際上是無法實現的,所以,必須使用匿名函數的立即執行來限定作用域
var arr = document.getElementsByTagName("p"); for(var i = 0; i < arr.length;i++){ (function(j){ arr[j].onclick = function(){ alert(j); } })(i) }四 循環中的異步函數
這樣一段代碼
for(var i=0;i這里i會是最大值,為何呢?因為這是一個異步函數,而非同步立即返回的函數,此時由于js奇怪的單線程機制,會待同步全部結束后再運行異步的代碼,所以i始終是最大值,那么要用什么方法解決呢?是的,加一個閉包。
這里留下一個問題,如果寫成這樣,你覺得可以么
for(var i=0;i總之,js真是一門奇異的語言
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83706.html
摘要:注意由于閉包會額外的附帶函數的作用域內部匿名函數攜帶外部函數的作用域,因此,閉包會比其它函數多占用些內存空間,過度的使用可能會導致內存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發中經常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...
摘要:權威指南第版中閉包的定義函數對象可以通過作用域鏈相互關聯起來,函數體內部的變量都可以保存在函數作用域內,這種特性在計算機科學文獻中成為閉包。循環中的閉包使用閉包時一種常見的錯誤情況是循環中的閉包,很多初學者都遇到了這個問題。 閉包簡介 閉包是JavaScript的重要特性,那么什么是閉包? 《JavaScript高級程序設計(第3版)》中閉包的定義: 閉包就是指有權訪問另一個函數中的變...
摘要:類型是提供的引用類型之一,通過可需變更創建對象。調用自身的函數被稱之為遞歸函數。想要解決上述遞歸函數的問題,可以使用對象屬性替換具體的函數名。保護貢獻的局部變量。 Function類型 概述 Function與函數 函數是這樣的一段JavaScript代碼,她只定義一次,但是可能被執行或調用多次。Function類型是JavaScript提供的引用類型之一,通過Function可u需變...
閱讀 3403·2023-04-25 20:37
閱讀 3146·2021-09-07 09:59
閱讀 1670·2019-08-29 12:43
閱讀 1191·2019-08-28 18:27
閱讀 485·2019-08-26 13:50
閱讀 2037·2019-08-26 10:33
閱讀 3598·2019-08-23 18:39
閱讀 2403·2019-08-23 18:09