前端 - 请教一下关于javascript作用域链的问题
大家讲道理
大家讲道理 2017-04-10 15:19:16
[JavaScript讨论组]
<body>
<input type="button" value="0" id="btn"/> //创建一个按钮
<script>
    window.onload=function(){
        var oBtn=document.getElementById('btn');//获取input对象
        oBtn.onclick=function(){    //添加点击事件
            ff();
        };
        function ff(){alert('哈哈')} //定义函数ff
    };
    ff();//报错 ff is not defined
</script>
</body>

请问为什么oBtn在点击的时候,会弹出‘哈哈’?

今天和同学遇到了这个问题,当时我们的困惑是:
function ff(){alert('哈哈')} ,在window.onload中的代码执行完毕后,应该就不存在了吧?那么input点击的时候,还怎么能调用到ff这个函数?
................................................................................................
回家查了查,目前我的理解是因为作用域链:
1.oBtn.onclick=function(){ ff(); } 定义在window.onload函数里。
2.当oBtn对象点击时,执行ff函数。
3.oBtn对象本身(好像叫调用对象?犀牛书5版)没有ff函数,到其作用域链的下一个对象中查找,也就是到window.onload=function(){...}中查找。
4.找到了function ff() { alert('哈哈'); }
5.因此oBtn点击的时候,弹出了‘哈哈’

我的理解正确吗?如果有错请您帮我指出来,谢谢。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
阿神

这个叫闭包(Closure)来着。当然跟作用域链有关系,但是主要还是要理解闭包。另外还要理解JavaScript的事件机制。
现在有点忙没法详细说,你可以先按照我上面提到的两点去查一查。

ringa_lee

我的理解:

ff();//报错 ff is not defined,因为全局变量下没有叫ff的函数。

window.onload=function(){...}其实就是一个闭包,外界是无法访问里面的变量和方法的。除非把方法给暴露出来。同理IIFE(立即执行函数)。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号