关于变量作用域

关于变量作用域

http://img1.sycdn.imooc.com//climg/5d36e87b0001ea3813880764.jpg

这两个布尔值变量在点击屏幕的时候应该就被释放了才对啊,怎么还能存在?

我写的这个就不行:

http://img1.sycdn.imooc.com//climg/5d36e8ca0001aadb10720818.jpg

http://img1.sycdn.imooc.com//climg/5d36e8e200019d2406620160.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

8回答

同学你好!

(1)注意:第一次回复中,变量isSetAnimateClass是相对于oclick是全局的,所以说不是点击之后释放。

(2)关于同命变量,k是不同的局部作用域,不同的局部作用域下同名变量就可以区分了(可以在for循环中打印k看下)

http://img1.sycdn.imooc.com//climg/5d38386100013ad404240102.jpg

http://img1.sycdn.imooc.com//climg/5d38386a00012d4d01760172.jpg

如果帮助到了你 欢迎采纳 祝学习愉快~

提问者 楚楚提 2019-07-24 17:50:00

是这里:

http://img1.sycdn.imooc.com//climg/5d38298700016ad017810825.jpg

每次循环不都是调用函数了吗,然后每次调用又都声明了同名变量,

而且点击事件有效说明每次循环调用函数所声明的同名变量都是存在的,

他们怎么区分的呢??

好帮手慕码 2019-07-24 17:38:09

同学你好!

请问是不理解for循环中的element?其实它们的指向都是一样的:都是screenAnimateElements[screenCls]中的某一个http://img1.sycdn.imooc.com//climg/5d38269f0001831611000719.jpg

还是不理解baseCls,这里就是在当前for中,给element添加了类名,叫baseCls。如果不是这里,同学可以截图在问答区提问,以便准确的帮助同学解答哦

如果如果帮助到了你 欢迎采纳 祝学习愉快~

  • 提问者 楚楚提 #1
    截图了...
    2019-07-24 17:50:25
好帮手慕码 2019-07-24 17:10:54

同学你好!

(1)同学的想法是大致是对的,图一中3的描述不准确,因为data是局部变量,受作用域的影响,所以3访问不到data,而不是说不能引用变量

(2)关于混淆的地方,他们二者是同一个变量,并不是同名变量:

http://img1.sycdn.imooc.com//climg/5d381fe600010b5b06800311.jpg

分不清楚变量指向哪一个的时候,可以在控制台打印看下。不是涉及底层,建议同学不要想得那么复杂。虽说java和前端有一些是相似的,但是还是要转变一下看法。

如果帮助到了你 欢迎采纳 祝学习愉快~

  • 提问者 楚楚提 #1
    大致明白了,最后一个我说混淆的地方是指多次for循环,而多次声明的同名变量,不是说一次for循环里面的
    2019-07-24 17:17:49
提问者 楚楚提 2019-07-24 11:15:56

http://img1.sycdn.imooc.com//climg/5d37cb6a0001fb1811430585.jpg

也就是说 因为2处是在函数里面,所以他可以引用1处函数定义的变量,即使他在引用的时候(也就是我点击的时候),此函数已经执行结束了,但是因为他在函数里面,所以他可以引用???

而3处是在函数外面了,所以不能引用函数定义的变量了.

然后我们回到课堂的代码:

http://img1.sycdn.imooc.com//climg/5d37cc280001f66613150701.jpg

如果我上述的想法是对的,那么2处自然可以引用1处的变量了,尽管2处是在一个事件句柄的内部函数里面,但是他还是在这个setScreenAnimate大函数里面,所以可以引用.

那么我说的关于混淆变量是这样:

http://img1.sycdn.imooc.com//climg/5d37cca700019bda07140124.jpg

因为这里循环调用函数,那么就会声明很多名称一样的变量了,如下:

http://img1.sycdn.imooc.com//climg/5d37cccc0001f90110080129.jpg

因为我在点击HTML元素的时候,我发现所有的元素都是可以正确响应的,也就是事件句柄函数中引用的变量都是存在的:

http://img1.sycdn.imooc.com//climg/5d37cd1700015af110420218.jpg

所以他们是怎么区分这些同名变量的呢?

_________________________________________________________________________________________________

这个问题是否已经牵涉到深一点的知识了呢??

包括自己以前学习java等其他语言的时候,对这种函数里面嵌套匿名内部函数的变量作用域也是有点晕...

好帮手慕码 2019-07-24 10:46:13

同学你好!

(1)没有被释放,因为是全局中的变量,并且子函数中还在使用

(2)同学写的这段代码是因为a标签默认有跳转功能,可以给a标签添加javascript:;来阻止跳转:

http://img1.sycdn.imooc.com//climg/5d37c3d40001975605170282.jpg

即可打印出data的值

http://img1.sycdn.imooc.com//climg/5d37c3e00001959d01520047.jpg

(3)不推荐相同的变量名,即使是局部变量,容易混淆,如果哪里无法区分,建议打印查看

(4)第一段代码中,data是test函数中的局部变量,外部是访问不到,所以没有输出

http://img1.sycdn.imooc.com//climg/5d37c5030001781f03820177.jpg

第二段代码中,点击了div之后打印的是test函数中的data

http://img1.sycdn.imooc.com//climg/5d37c5d2000145f606810273.jpg

同在test一个局部中因此可以访问到data

http://img1.sycdn.imooc.com//climg/5d37c5dc0001a01b05190030.jpg

建议同学不要往释放方面思考,其实通俗讲就是局部,全局作用域的问题,没有那么复杂哦

如果帮助到了你 欢迎采纳 祝学习愉快~

  • 提问者 楚楚提 #1
    我添加了新问题
    2019-07-24 11:06:01
提问者 楚楚提 2019-07-23 19:21:01

以下两端代码:

http://img1.sycdn.imooc.com//climg/5d36ed210001631809840442.jpg

并没有输出data的字符串

取消注释:

http://img1.sycdn.imooc.com//climg/5d36ed5000018ffd09270609.jpg

点击后出现字符串输出

难道内部函数能够改变js的变量作用域?

前者没有内部函数,data是在函数中声明的,应该是被释放了?

而后者在函数结束后并没有被释放

这是什么机理?

提问者 楚楚提 2019-07-23 19:12:44

测试了以下,确实可以打印,那么脚本中循环执行下面这个代码的时候:

http://img1.sycdn.imooc.com//climg/5d36eb7d00017f3805920140.jpg

怎么区分每次执行函数中的名称相同的变量呢?

js的这个作用域怎么和其他语言不一样,搞得我好晕.

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师