node.js 函数外定义的变量 函数内赋值后为什么不能带出_(44)python少儿编程之函数(五)--- 作用域...

函数嵌套

  • 在一个函数内定义了另一个函数
be34fb91b1615fee4da1626461314e7d.png
  • 如图,定义了一个outer函数,然后在outer函数里面又定义了一个inner()函数,此时我们只能在outer函数调用inner()函数,如果在outer函数外调用inner函数就会报错,那这里就引出了一个概念,作用域。
  • 函数有可见范围,这就是作用域的概念
  • inner这里成为是outer函数的内部函数,不能在外部直接被调用,否则就会报错!

作用域

  • 一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域。
  • 全局作用域
    • 在整个程序运行环境中都可见
  • 局部作用域
    • 在函数、类等内部可见
    • 局部变量使用范围不能超过其所在的局部作用域
acc8169064cfd2bfe69fbbcbaeda2241.png
    • 如图,x就是全局作用域 fn1和fn2函数都可以使用 但是y就是只能在fn1内使用,如果再fn2使用就会报错!
  • 为了更明确的理解,我们再来看一个例子
155277d841f5aed70bc16770fd542035.png
  • 都为o,一个是outer2函数的变量,一个是内部函数inner的变量,当我们更改了内部函数o的值你会发现,内部函数打印出来的是97,但是在在外部函数继续打印的时候,还是原来的65,内部函数的更改,其实没有影响外部变量o的值,所以这个例子更能反映作用域的概念!
  • 从这个例子可以看出
    • 外层变量作用域在内存作用域是可见的
    • 内层作用域,如果定义了o = 97,其实相当于重新定义了一个变量o,但是这个o并没有覆盖外层作用域outer中的o
    • 我们再来看一个例子
dc8666214ddff51105bd9a13b55f2ceb.png
  • 如图,首先我们全局变量定义了一个x,然后在函数内做了自加1的操作,然后系统就报错了,这是为什么呢?
  • 其实这里也解释了上面的概念,首先x += 1 就是 x = x +1 ,这个操作等于在foo函数里面又定义了一个x变量,就跟外面的x无关了,但是这个x都没赋值过,也不知道什么类型,然后就去 +1,自然就报错了!
  • 那怎么解决这个问题呢,有时候我们就想用这个全局变量呢?

全局变量global

9f65eb38e3b4fbb4e044b1c7801145d0.png
  • 如图,使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x
  • 全局作用域中必须有x的定义
  • 那如果全局作用域没有这个定义呢? 答案是要报错的!
  • 那再思考一个问题,如果在内部函数定义全局变量以后,外部能访问到吗?
274cde51c4174db813a7639cf76ac976.png
  • 如图,我在foo函数内,定义了一个x=10,然后加1,在外部打印后变成11,说明结果正确!这里的x的作用域一直都是全局的!
  • globel总结
    • 内部作用域使用x=10的赋值语句会重新定义局部作用域使用的变量x,但是这个作用域一旦使用过globe声明过,那么x=10就等于为全局作用域的变量x赋值
    • 但是即使外部作用域的变量可以在内部作用域使用,但也不要直接那样用,函数就是为了封装,跟外界隔离,尽量用函数的形参传参来解决,所有,最后总结一句话,就是不要用 globel,学习它只是为了深刻理解变量作用域而已!切记!

好了,今天的课程就到这里,此章节还是比较重要的,好好练习一下!

7da512639824283d083250bfe04a796a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值