为了账号安全,请及时绑定邮箱和手机立即绑定

请教一下关于javascript作用域链的问题

请教一下关于javascript作用域链的问题

一只萌萌小番薯 2019-04-10 20:48:51
//创建一个按钮window.onload=function(){varoBtn=document.getElementById('btn');//获取input对象oBtn.onclick=function(){//添加点击事件ff();};functionff(){alert('哈哈')}//定义函数ff};ff();//报错ffisnotdefined请问为什么oBtn在点击的时候,会弹出‘哈哈’?今天和同学遇到了这个问题,当时我们的困惑是:functionff(){alert('哈哈')},在window.onload中的代码执行完毕后,应该就不存在了吧?那么input点击的时候,还怎么能调用到ff这个函数?................................................................................................回家查了查,目前我的理解是因为作用域链:1.oBtn.onclick=function(){ff();}定义在window.onload函数里。2.当oBtn对象点击时,执行ff函数。3.oBtn对象本身(好像叫调用对象?犀牛书5版)没有ff函数,到其作用域链的下一个对象中查找,也就是到window.onload=function(){...}中查找。4.找到了functionff(){alert('哈哈');}5.因此oBtn点击的时候,弹出了‘哈哈’我的理解正确吗?如果有错请您帮我指出来,谢谢。
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

这个叫闭包(Closure)来着。当然跟作用域链有关系,但是主要还是要理解闭包。另外还要理解JavaScript的事件机制。
现在有点忙没法详细说,你可以先按照我上面提到的两点去查一查。
                            
查看完整回答
反对 回复 2019-04-10
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我的理解:
ff();//报错ffisnotdefined,因为全局变量下没有叫ff的函数。
window.onload=function(){...}其实就是一个闭包,外界是无法访问里面的变量和方法的。除非把方法给暴露出来。同理IIFE(立即执行函数)。
                            
查看完整回答
反对 回复 2019-04-10
  • 2 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信