function-p生活中每樣?xùn)|西都有歸屬范圍不能亂拿用_第1頁
function-p生活中每樣?xùn)|西都有歸屬范圍不能亂拿用_第2頁
function-p生活中每樣?xùn)|西都有歸屬范圍不能亂拿用_第3頁
function-p生活中每樣?xùn)|西都有歸屬范圍不能亂拿用_第4頁
function-p生活中每樣?xùn)|西都有歸屬范圍不能亂拿用_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

作用域(scope)作用域(scope)一家人野餐生活中,每樣?xùn)|西都有歸屬范圍。不能亂拿亂用。比如:一家人去公園野餐。家里人既可以吃自家?guī)У臇|西,又可以去公園的商店里買東西吃公園商店作用域(scope)現(xiàn)實(shí)中:外人不能隨意拿咱家的東西公園一家人野餐外人作用域(scope)現(xiàn)實(shí)中:而公園里商店賣的東西,所有人都可以去買公園一家人野餐另一家人野餐商店外人作用域(scope)范圍:自家?guī)У某缘?,僅限于家庭范圍內(nèi)公園提供的吃的,公園范圍內(nèi)的所有人都可以去買公園的范圍一家人野餐另一家人野餐商店作用域作用域英文原文為scope,本意就是“范圍”的意思作用域是指一個(gè)數(shù)據(jù)的可用范圍。定義作用域是為了避免內(nèi)外不同范圍的數(shù)據(jù)間互相干擾公園的范圍一家人野餐另一家人野餐外人作用域JavaScript程序中,也包含兩級(jí)作用域:1.

全局作用域,指從任何位置都可 的范圍2.

函數(shù)作用域,指僅限于函數(shù)內(nèi)才可

的范圍全局作用域(全局范圍)

windowfunction函數(shù)(){這里是函數(shù)作用域(函數(shù)范圍)}全局變量去商店買東西定義在不同范圍的變量也有不同的名稱。全局變量,是指保存在全局作用域中的變量。全局變量可在程序中的任何位置都能

。比如:下方程序中的變量“商店”既可在函數(shù)范圍內(nèi)訪問到,也可在全局范圍內(nèi) 到。全局范圍windowvar商店=“公園的商店”function

自家野餐(){

函數(shù)范圍去

商店

買東西}局部變量局部變量,是指保存在某一個(gè)函數(shù)內(nèi)的變量。局部變量只能在函數(shù)內(nèi)使用。比如:下方程序中,函數(shù)范圍內(nèi)的變量“面包”全局范圍window吃面包function自家野餐(){函數(shù)范圍

var面包=“自家的面包”吃面包}作用域鏈(scopechain)現(xiàn)實(shí)中:一家人既可以吃自家?guī)У臇|西,又可以去公園商店買東西但通常只要自己家里有,就不去外部買??偸莾?yōu)先吃自己家?guī)У?。公園范圍自家野餐商店作用域鏈(scope

chain)現(xiàn)實(shí)中:這里就有個(gè)順序關(guān)系:自家野餐公園范圍

商店作用域鏈(scopechain)比如:如下程序:全局范圍windowvar

商店=“公園的商店”;var

面包=“公園的面包”;//輸出?//輸出?function

自家野餐(){函數(shù)范圍var

面包=“自家的面包”吃面包去商店買好吃的}自家野餐()全局范圍window商店=“公園的商店”面包=“公園的面包”{

函數(shù)作用域面包=“自家?guī)У拿姘眪作用域鏈(scopechain)函數(shù)在執(zhí)行時(shí),有兩個(gè)范圍的數(shù)據(jù)可使用,順序如下:function自家野餐(){var面包=“自家?guī)У拿姘背悦姘ド痰曩I東西}自家野餐() //調(diào)用函數(shù)時(shí),用鎖鏈串聯(lián)兩級(jí)作用域//輸出“自家?guī)У拿姘?/輸出“公園的商店”驗(yàn)證作用域鏈同時(shí)定義全局變量和局部變量,其中,全局變量和局部變量中有部分變量重名定義函數(shù)使用這些變量,觀察使用順序作用域鏈(scopechain)作用域鏈,就是由多級(jí)作用域組成的鏈?zhǔn)浇Y(jié)構(gòu)當(dāng)調(diào)用函數(shù)時(shí),函數(shù)會(huì)將自己能用到的所有作用域都用“鎖鏈”串聯(lián)(

)起來。作用域鏈:1.串連著當(dāng)前函數(shù)可使用的所有作用域范圍,保存著當(dāng)前函數(shù)可用的所有變量2.控制著變量的使用順序:先局部,后全局;只要局部有,就不去全局找。閉包需求:定義一個(gè)管理孩子壓歲錢的函數(shù)函數(shù)名:“孩子花壓歲錢”每次輸入花的錢數(shù)程序從總壓歲錢數(shù)中減去本次花的錢數(shù),并輸出余額function孩子花壓歲錢(){100);//花了100元,還剩900元孩子花壓歲錢(孩子花壓歲錢(100);//又花了100元,還剩800元//假設(shè)共1000元壓歲錢total=total-¥;show(

`花了${x}元,還剩${total}元`)}¥問題:如何保存壓歲錢數(shù)2個(gè)方案:1.可保存在函數(shù)2.可保存在函數(shù)外部function孩子花壓歲錢(x){total=total-x;show(

`花了${x}元,還剩${total}元`)}var

total=1000;

?var

total=1000;

?回顧:全局作用域vs函數(shù)作用域JavaScript程序中,也包含兩級(jí)作用域:1.

全局作用域,指從任何位置都可 的范圍2.

函數(shù)作用域,指僅限于函數(shù)內(nèi)才可

的范圍function函數(shù)(){(函數(shù)范圍)“自家”這里是函數(shù)作用域}全局作用域(全局范圍)“樓道”外人回顧:全局變量定義在全局作用域中的變量,稱為全局變量全局變量的缺點(diǎn):極易被篡改全局范圍total=0

;//篡改total孩子花壓歲錢(100);//花了100元,還剩-100元var

total=1000;function

孩子花壓歲錢(

x

){ 函數(shù)范圍……}外人實(shí)現(xiàn)壓歲錢管理函數(shù)篡改壓歲錢程序中的全局變量回顧:局部變量定義在一個(gè)函數(shù)范圍內(nèi)的變量,稱為局部變量。局部變量的缺點(diǎn):不可重用全局范圍function

孩子花壓歲錢(

x

){ 函數(shù)范圍total=total-x;show(

`花了${x}元,還剩${total}元`)}var

total=1000;外人回顧:局部變量函數(shù)得了失憶癥:回顧:局部變量調(diào)用函數(shù)后,函數(shù)作用域及其 的局部變量都 了:全局范圍function

孩子花壓歲錢(x){ 函數(shù)范圍var

total=1000;total=total-x;show(

`花了${x}元,還剩${total}元`)}//不可重用,不可累積孩子花壓歲錢(100);//第二次又了花了10100,0,輸還出輸剩9出0剩0

900{

函數(shù)作用域total=1000-100=900}實(shí)現(xiàn)壓歲錢管理函數(shù)使用局部變量嘗試實(shí)現(xiàn)壓歲錢程序閉包如何:既反復(fù)使用變量total,又不想total被篡改?家長保管¥1000孩子花外人閉包第一步:用外層函數(shù)內(nèi)層函數(shù)和要保護(hù)的變量全局范圍function

父母保管壓歲錢(){

外層函數(shù)范圍var

total=1000

;function

孩子花壓歲錢(

x

){ 內(nèi)層函數(shù)范圍total=total-x;show(

`花了${x}元,還剩${total}元`)}}total=0;//試圖篡改total閉包第二步:外層函數(shù)將內(nèi)層函數(shù)返回到外部全局范圍return孩子花壓歲錢()function

父母保管壓歲錢(){

外層函數(shù)范圍var

total=1000

;function(x){

內(nèi)層函數(shù)范圍…

…}}閉包…

…}}returnfunction(x){

內(nèi)層函數(shù)范圍第三步:調(diào)用外層函數(shù),獲得內(nèi)層函數(shù),保存到全局變量全局范圍function

父母保管壓歲錢(){

外層函數(shù)范圍var

total=1000

;孩子花壓歲錢=父fun母ct保ion管(壓x){歲父錢母()返回的內(nèi)層函數(shù)total=total-x;show(

`花了${x}元,還剩${total}元`)}閉包結(jié)果:變量”孩子花壓歲錢”得到了內(nèi)層函數(shù),可反復(fù)用全局范圍…

…孩子花壓歲錢=

function(

x

){

父母返回的內(nèi)層函數(shù)“孩子”total=total-x;show(

`花了${x}元,還剩${total}元`)}{

父母給的}var

total=1000;閉包total=0;//無法修改父母的變量total執(zhí)行結(jié)果:孩子花壓歲錢(100);//花了100,還剩900孩子花壓歲錢(100);//花了100,還剩800孩子花壓歲錢(100);//花了100,還剩700使用閉包實(shí)現(xiàn)壓歲錢管理函數(shù)使用閉包實(shí)現(xiàn)壓歲錢管理函數(shù)閉包閉包,是既重用變量又保護(hù)變量不被篡改的一種編程方法。今后,只要希望既重用變量,又保護(hù)變量不被篡改時(shí),就要用閉包為一個(gè)函數(shù)保管專屬的變量。如何:3步1. 外層函數(shù) 內(nèi)層函數(shù)和要保護(hù)的變量2.外層函數(shù)返回內(nèi)層函數(shù)對(duì)象到外部3.外部使用者調(diào)用外層函數(shù),獲得內(nèi)層函數(shù)對(duì)象,并保存在外部變量中反復(fù)使用。閉包外層函數(shù)”父母…”調(diào)用后,函數(shù)作用域以及局部變量total=1000應(yīng)該 ,卻沒 ,并且還可反復(fù)使用孩子花壓歲錢=var

total=1000父fu母nc保tio管n(

壓x

)歲{

內(nèi)錢層()函數(shù)范圍total=total-x;show(

`花了${x}元,還剩${total}元`)}孩子花壓歲錢(10外0)層;/函/花數(shù)了“1父0母0,還”剩的9臨0時(shí)0

函數(shù)作用域:孩子花壓歲錢(100);//花了100,還剩700孩子花壓歲錢(100);//花了100,還剩800閉包現(xiàn)實(shí)中:父母想沒收孩子的壓歲錢,孩子一定不同意!壓歲錢給我留下!你拿走了,我怎么辦?!閉包創(chuàng)建內(nèi)層函數(shù)時(shí),內(nèi)層函數(shù)的[[scopes]]屬性,始終拴著自己可用的外層函數(shù)作用域。孩子花壓歲錢=父fu母nct保io管n(

壓x

)歲{

內(nèi)錢層()函數(shù)范圍total=total-x;sh外ow層(`函花數(shù)了$“{x父}元母,還”剩的$

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論