function-p生活中每样东西都有归属范围不能乱拿用_第1页
function-p生活中每样东西都有归属范围不能乱拿用_第2页
function-p生活中每样东西都有归属范围不能乱拿用_第3页
function-p生活中每样东西都有归属范围不能乱拿用_第4页
function-p生活中每样东西都有归属范围不能乱拿用_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作用域(scope)作用域(scope)一家人野餐生活中,每样东西都有归属范围。不能乱拿乱用。比如:一家人去公园野餐。家里人既可以吃自家带的东西,又可以去公园的商店里买东西吃公园商店作用域(scope)现实中:外人不能随意拿咱家的东西公园一家人野餐外人作用域(scope)现实中:而公园里商店卖的东西,所有人都可以去买公园一家人野餐另一家人野餐商店外人作用域(scope)范围:自家带的吃的,仅限于家庭范围内公园提供的吃的,公园范围内的所有人都可以去买公园的范围一家人野餐另一家人野餐商店作用域作用域英文原文为scope,本意就是“范围”的意思作用域是指一个数据的可用范围。定义作用域是为了避免内外不同范围的数据间互相干扰公园的范围一家人野餐另一家人野餐外人作用域JavaScript程序中,也包含两级作用域:1.

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

函数作用域,指仅限于函数内才可

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

windowfunction函数(){这里是函数作用域(函数范围)}全局变量去商店买东西定义在不同范围的变量也有不同的名称。全局变量,是指保存在全局作用域中的变量。全局变量可在程序中的任何位置都能

。比如:下方程序中的变量“商店”既可在函数范围内访问到,也可在全局范围内 到。全局范围windowvar商店=“公园的商店”function

自家野餐(){

函数范围去

商店

买东西}局部变量局部变量,是指保存在某一个函数内的变量。局部变量只能在函数内使用。比如:下方程序中,函数范围内的变量“面包”全局范围window吃面包function自家野餐(){函数范围

var面包=“自家的面包”吃面包}作用域链(scopechain)现实中:一家人既可以吃自家带的东西,又可以去公园商店买东西但通常只要自己家里有,就不去外部买。总是优先吃自己家带的。公园范围自家野餐商店作用域链(scope

chain)现实中:这里就有个顺序关系:自家野餐公园范围

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

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

面包=“公园的面包”;//输出?//输出?function

自家野餐(){函数范围var

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

函数作用域面包=“自家带的面包”}作用域链(scopechain)函数在执行时,有两个范围的数据可使用,顺序如下:function自家野餐(){var面包=“自家带的面包”吃面包去商店买东西}自家野餐() //调用函数时,用锁链串联两级作用域//输出“自家带的面包”//输出“公园的商店”验证作用域链同时定义全局变量和局部变量,其中,全局变量和局部变量中有部分变量重名定义函数使用这些变量,观察使用顺序作用域链(scopechain)作用域链,就是由多级作用域组成的链式结构当调用函数时,函数会将自己能用到的所有作用域都用“锁链”串联(

)起来。作用域链:1.串连着当前函数可使用的所有作用域范围,保存着当前函数可用的所有变量2.控制着变量的使用顺序:先局部,后全局;只要局部有,就不去全局找。闭包需求:定义一个管理孩子压岁钱的函数函数名:“孩子花压岁钱”每次输入花的钱数程序从总压岁钱数中减去本次花的钱数,并输出余额function孩子花压岁钱(){100);//花了100元,还剩900元孩子花压岁钱(孩子花压岁钱(100);//又花了100元,还剩800元//假设共1000元压岁钱total=total-¥;show(

`花了${x}元,还剩${total}元`)}¥问题:如何保存压岁钱数2个方案:1.可保存在函数2.可保存在函数外部function孩子花压岁钱(x){total=total-x;show(

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

total=1000;

?var

total=1000;

?回顾:全局作用域vs函数作用域JavaScript程序中,也包含两级作用域:1.

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

函数作用域,指仅限于函数内才可

的范围function函数(){(函数范围)“自家”这里是函数作用域}全局作用域(全局范围)“楼道”外人回顾:全局变量定义在全局作用域中的变量,称为全局变量全局变量的缺点:极易被篡改全局范围total=0

;//篡改total孩子花压岁钱(100);//花了100元,还剩-100元var

total=1000;function

孩子花压岁钱(

x

){ 函数范围……}外人实现压岁钱管理函数篡改压岁钱程序中的全局变量回顾:局部变量定义在一个函数范围内的变量,称为局部变量。局部变量的缺点:不可重用全局范围function

孩子花压岁钱(

x

){ 函数范围total=total-x;show(

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

total=1000;外人回顾:局部变量函数得了失忆症:回顾:局部变量调用函数后,函数作用域及其 的局部变量都 了:全局范围function

孩子花压岁钱(x){ 函数范围var

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

`花了${x}元,还剩${total}元`)}//不可重用,不可累积孩子花压岁钱(100);//第二次又了花了10100,0,输还出输剩9出0剩0

900{

函数作用域total=1000-100=900}实现压岁钱管理函数使用局部变量尝试实现压岁钱程序闭包如何:既反复使用变量total,又不想total被篡改?家长保管¥1000孩子花外人闭包第一步:用外层函数内层函数和要保护的变量全局范围function

父母保管压岁钱(){

外层函数范围var

total=1000

;function

孩子花压岁钱(

x

){ 内层函数范围total=total-x;show(

`花了${x}元,还剩${total}元`)}}total=0;//试图篡改total闭包第二步:外层函数将内层函数返回到外部全局范围return孩子花压岁钱()function

父母保管压岁钱(){

外层函数范围var

total=1000

;function(x){

内层函数范围…

…}}闭包…

…}}returnfunction(x){

内层函数范围第三步:调用外层函数,获得内层函数,保存到全局变量全局范围function

父母保管压岁钱(){

外层函数范围var

total=1000

;孩子花压岁钱=父fun母ct保ion管(压x){岁父钱母()返回的内层函数total=total-x;show(

`花了${x}元,还剩${total}元`)}闭包结果:变量”孩子花压岁钱”得到了内层函数,可反复用全局范围…

…孩子花压岁钱=

function(

x

){

父母返回的内层函数“孩子”total=total-x;show(

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

父母给的}var

total=1000;闭包total=0;//无法修改父母的变量total执行结果:孩子花压岁钱(100);//花了100,还剩900孩子花压岁钱(100);//花了100,还剩800孩子花压岁钱(100);//花了100,还剩700使用闭包实现压岁钱管理函数使用闭包实现压岁钱管理函数闭包闭包,是既重用变量又保护变量不被篡改的一种编程方法。今后,只要希望既重用变量,又保护变量不被篡改时,就要用闭包为一个函数保管专属的变量。如何:3步1. 外层函数 内层函数和要保护的变量2.外层函数返回内层函数对象到外部3.外部使用者调用外层函数,获得内层函数对象,并保存在外部变量中反复使用。闭包外层函数”父母…”调用后,函数作用域以及局部变量total=1000应该 ,却没 ,并且还可反复使用孩子花压岁钱=var

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

压x

)岁{

内钱层()函数范围total=total-x;show(

`花了${x}元,还剩${total}元`)}孩子花压岁钱(10外0)层;/函/花数了“1父0母0,还”剩的9临0时0

函数作用域:孩子花压岁钱(100);//花了100,还剩700孩子花压岁钱(100);//花了100,还剩800闭包现实中:父母想没收孩子的压岁钱,孩子一定不同意!压岁钱给我留下!你拿走了,我怎么办?!闭包创建内层函数时,内层函数的[[scopes]]属性,始终拴着自己可用的外层函数作用域。孩子花压岁钱=父fu母nct保io管n(

压x

)岁{

内钱层()函数范围total=total-x;sh外ow层(`函花数了$“{x父}元母,还”剩的$

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论