1. 程式人生 > >js 匿名函式和閉包函式(js練習)

js 匿名函式和閉包函式(js練習)

一、閉包的定義:閉包說白了就是函式的巢狀,內層的函式可以使用外層函式的所有變數,即使外層函式已經執行完畢(這點涉及JavaScript作用域鏈)。

二、閉包的練習程式碼

1、首先(保證頁面引入了jQuery)建立

window.document.body.innerHTML="<p>開始練習document物件</p>"


2、js建立ul和li標籤,並且新增ul標籤在body裡面

var UL1=jQuery("<ul>,{name:'ul1'}");
UL1.appendTo(window.document.body);
var Li1=jQuery("<li>",{value:'01',text:'01li'});
var Li2=jQuery("<li>",{value:'02',text:'02li'});
var Li3=jQuery("<li>",{value:'03',text:'03li'});

Li1.appendTo(document.body.getElementsByTagName("ul"));
Li2.appendTo(document.body.getElementsByTagName("ul"));								                   			  Li3.appendTo(document.body.getElementsByTagName("ul"));

3、若執行下面的程式碼:

var Lis = document.getElementsByTagName("li");//找到Li標籤
function showAllLi(){for(var i = 0 ; i <Lis.length ; i++)
{
Lis[i].onclick = function(){console.log(i,$(Lis[i]).text())}
}}


本想挨個輸出Lis[0] 、Lis[1] 、Lis[2] 的值,但是最終結果卻是:
VM30474:3 ""
三個都是一樣的結果,原來i變數已經被加到了3;

(運用立即函式,不帶返回值的情況):

for(var i = 0 ; i <Lis.length ; i++)
{
Lis[i].onclick = (function(i){ console.log($(Lis[i]).text()) })(i)
}


得到的結果是,立即分別輸出了三個<li>標籤的內容;

但是,值得注意的是:<li>標籤在chrome瀏覽器中,立即執行函式卻並未繫結到click事件;

解決辦法一(Reference1):

for(var i = 0 ; i <Lis.length ; i++){
(function(i){
 Lis[i].onclick = function(){
return function(){
console.log($(Lis[i]).text())
}
}
})(i)
}



解決辦法二:

for(var i = 0 ; i <Lis.length ; i++)
{
Lis[i].onclick = function(){ console.log($(this).text()) }
}




Reference:

1、http://www.360doc.com/content/15/0615/09/10504424_478206402.shtml

相關推薦

js 匿名函式函式js練習

一、閉包的定義:閉包說白了就是函式的巢狀,內層的函式可以使用外層函式的所有變數,即使外層函式已經執行完畢(這點涉及JavaScript作用域鏈)。 二、閉包的練習程式碼 1、首先(保證頁面引入了jQuery)建立 window.document.body.innerHT

js 匿名函式函式

例子: function checkClosure(){ for(var i=0;i<3;i++){ setTimeout(function(){ alert(i); },2000); } }  checkClosure(); 仔細想一想這個函式的執行結果是什麼輸出0

Python基礎——匿名函式函式

一.匿名函式:    在定義函式的時候,不想給函式起一個名字。這個時候就可以用lambda來定義一個匿名函式    語法:    變數名= lambda 引數:表示式(block)    引數:

JS匿名函式

一、匿名函式 函式是JavaScript中最靈活的一種物件,這裡只是講解其匿名函式的用途。匿名函式:就是沒有函式名的函式 函式定義常規方式 第一種:這也是最常規的一種 function double(x){ return 2 * x; } 第二種:這種方法使

php中的匿名函式

一:匿名函式 (在php5.3.0 或以上才能使用)      php中的匿名函式(Anonymous functions), 也叫閉包函式(closures), 允許指定一個沒有名稱的函式。最常用的就是回撥函式的引數值。(http://php.net/m

《零基礎入門學習Python》20--函式:內嵌函式

前言 之前我們講了函式的一些相關知識,瞭解了什麼是全域性變數什麼是區域性變數,接下來我們看看怎麼將區域性變數變為全域性變數。還要將將內嵌函式的相關概念 知識點 global關鍵字  使用global關鍵字,可以修改全域性變數: >>> count

php中的匿名函式(closure)

一:匿名函式 (在php5.3.0 或以上才能使用)      php中的匿名函式(Anonymous functions), 也叫閉包函式(closures), 允許指定一個沒有名稱的函式。最常用的就是回撥函式的引數值。(http://php.net/m

第020講:函式:內嵌函式 | 學習記錄小甲魚零基礎入門學習Python

(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 0.如果希望在函式中改變全域性變數的值,應該使用什麼關鍵字? global 1.在巢狀的函式中,如果希望在內部函式修改外部函式的區域性變數,應該使用什麼關鍵字? nonlocal 2.pyth

IOS-函式基礎一

函式和閉包 使用 func 來宣告一個函式,通過函式的名字和引數來呼叫函式。使用 -> 指定函式返回值(分離了返回值和引數) func greet(name: String, day: String) -> String { return

一個函式理解js的this——詳解debounce

debounce應用場景模擬 debounce函式,俗稱防抖函式,專治input、resize、scroll等頻繁操作打爆瀏覽器或其他資源。前端面試幾乎必考,當然肯定會做一些變化。 <!DOCTYPE html> <html lang="en">

Go匿名函式

匿名函式          匿名函式是指不需要定義函式名的一種函式實現方式。          在Go語言中,函式可以像普通變數一樣被傳遞或使用,這與C語言的回撥函式比較類似。不同的是,Go語言支援隨

第020講:函式:內嵌函式

目錄 測試題 0.如果希望在函式中修改全域性變數的值,應該使用什麼關鍵字? 1.在巢狀的函式中,如果希望在內部修改外部函式的區域性變數,應該使用什麼關鍵字? 2. Python 的函式可以巢狀,但要注意訪問的作用域問題哦,請問以下程式碼存在什麼問題呢? 3. 請問為什麼程式碼 A

Go基礎系列:函式(2)——回撥函式

回撥函式和閉包 當函式具備以下兩種特性的時候,就可以稱之為高階函式(high order functions): 函式可以作為另一個函式的引數(典型用法是回撥函式) 函式可以返回另一個函式,即讓另一個函式作為這個函式的返回值(典型用法是閉包) 一般來說,附帶的還具備一個特性:函式可以作為一個值賦值給變數

1.13 JavaScript4:函式

函式 函式就是重複執行的程式碼片。 函式定義與執行 <script type="text/javascript"> // 函式定義 function aa(){

functions and closures are reference types-函式是引用型別

Closures Are Reference Types In the example above, incrementBySeven and incrementByTen are constants, but the closures these constants

[js點滴]js函式函式詳解

1、匿名函式 函式是JavaScript中最靈活的一種物件,這裡只是講解其匿名函式的用途。匿名函式:就是沒有函式名的函式。 1.1 函式的定義,首先簡單介紹一下函式的定義,大致可分為三種方式 第一種:這也是最常規的一種 function dou

day 12 名稱空間函式

函式巢狀   按照函式的兩個階段分為:     巢狀呼叫:在一個函式內部呼叫另一個函式     巢狀定義:在一個函式內部定義另一個函式 名稱空間(namespace):儲存名字的記憶體區域 名稱空間的分類:   內建名稱空間:存的是直譯器自帶的名稱   全域性名稱空間:只要是頂著最左邊寫的,沒有

python進階5:外層函式、內層函式

  在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如: def f(): print 'f()' def g(): print 'g()' return g #將g定義在函式f內部,防止其他程式碼呼叫g  但

[python3]內嵌函式

1.內嵌函式 內嵌函式(允許在函式內部建立另一個函式,叫內部函式)  def fun1(): print('fun1 is using...') def fun2(): print('fun2 is using...') fun2(

Scala:函式

Scala函式Scala 有函式和方法,二者在語義上的區別很小。Scala 方法是類的一部分,而函式是一個物件可以賦值給一個變數。換句話來說在類中定義的函式即是方法。我們可以在任何地方定義函式,甚至可以在函式內定義函式(內嵌函式)。更重要的一點是 Scala 函式名可以由以下