都是Javascript的作用域惹得祸

案件重现

今天有位然之OA系统的定制开发用户咨询了个问题,他想在新加的功能模块的操作面板中,实现用户点击删除按钮时提示友好提醒,如下:

问题很简单,虽然他自己最终达到目的效果了,但不知道起初问题出在哪里。通过交流了解,他开始是这么做的,大致问题代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script>
        window.onload=function () {
            function confirmdelete() {
                return  window.confirm("你确定要删除吗?");
            }
        }

    </script>
</head>
<body>

</body>
<?php
   echo "<a onclick='confirmdelete()'>删除</a>";
?>

结果未能达到目的,点击删除按钮没有效果,然后这位朋友将window.onload删除后,再试了一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script>
            function confirmdelete() {
                return  window.confirm("你确定要删除吗?");
            }
    </script>
</head>
<body>

</body>
<?php
   echo "<a onclick='return confirmdelete()'>删除</a>";
?>

结果成功了,点击删除按钮成功触发事件,弹出提示框。于是这位朋友就怀疑是不是window.onload将JS代码在页面全部加载完毕后再执行就无效了,是不是代码执行顺序的问题。

事实真的是这样么?

当然不是。相信很多朋友已经发现了真正的问题所在——作用域。

这位朋友起初将confirmdelete函数写成了onload事件的一个内函数,那么confirmdelete就是一个闭包,而删除事件触发后,它是在全局作用域中查找调用函数,由于全局上是找不到这个函数,所以无效。

所以这里我们可以将闭包改为全局变量即可,在JS函数中,声明变量时不用var关键字,则它就是全局变量。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script>
        window.onload=function () {
            confirmdelete = function() {
                return  window.confirm("你确定要删除吗?");
            }
        }

    </script>
</head>
<body>

<?php
   echo "<a onclick='confirmdelete()'>删除</a>";
?>
</body>

这样也是同样有效的。最后只好建议这位朋友在深入了解下JS的变量作用域和闭包等概念。

总结:

有时困扰大牛的不是前面宽阔难以跨越的激流河道,而是身上甩不掉的苍蝇蚊虫。钻完牛角尖后,回过头来发现问题原来如此简单。是否日复一日地写业务代码写的麻木了?是否发现天天刷怪升级,但技能点却总提不上去?不妨返璞归真,温故而知新。最近自己也深有感触,越来越感受到最可怕的事情莫过于今天过的和昨天没有不同。所以居安思危,每天都要改变,每天都要有提升进步。

时间: 2024-09-18 22:27:42

都是Javascript的作用域惹得祸的相关文章

都是标量子查询惹的祸

都是标量子查询惹的祸 系统又报了一个跑的慢的sql语句,看图就知道这个很恐怖的,已经跑了1天了,还需要跑6个月的时间,   把sql语句拿出来瞅瞅: --201406 XX select SUM(UNPOSTING_AMT_CYC) 分期未结清余额, SUM(greatest(nvl(BAL_TOTAL,0),0)) 余额,COUNT(1),DELQ_LEVEL_CI,city,FQ_TOTAL, CASE WHEN greatest(nvl(BAL_TOTAL,0),0) 500 THEN '

为什么程序员都是夜猫子 电脑屏幕惹的祸?

一种很流行的说法是,程序员是把咖啡因转化成程序代码的机器. 说的是实情,随便问一个程序员,问他什么时候工作最有状态,估计他很有可能说是深夜.有人稍微早一点,有人更晚.有一种流行的趋势是凌晨4点起床,在破晓之前这段时间里做一些事情.而另一些人喜欢凌晨4点才睡觉. 所有这些的主要目的是躲避打搅.但是你把自己反锁在屋里不就行了?为什么对夜晚情有独钟? 我想,这事归纳下来有3点:工人的时间表,疲倦的大脑和明亮的电脑屏幕. 工人的时间表 Paul Graham 在2009年写了一篇关于 工人的时间表的文章

都是心太急惹的祸彩民险把10万当100元兑

刮彩票中奖了,但奖金数字才刮出"¥100"就兴奋地拿给销售员兑奖了,要不是体彩销售员讲诚信,刮开全部数字告知是"¥100000",10万元大奖可就落入别人口袋了.7月21日,前来顺德体彩中心兑取"五倍幸运"10万大奖的王先生,一个劲夸体彩销售人员诚信. 10元换来10万元大奖 7月21日,顺德伦教22107体彩网点传出刮中10万元顶呱刮大奖的喜讯.当天下午5点15分左右,三个小伙子走进顺德体彩中心兑奖大厅,其中一位拿出一张"五倍幸运&q

都是频繁换手惹的祸泰达宏利成长迎来“末位”烦恼

文/李英 向莹 来自海通证券基金研究中心的最新数据显示,基金2011年换手率整体有所下降,但仍保持平均半年换手一次的较高记录.据笔者了解,相较美国股票型基金经理平均每年60%-80%左右的换手率,中国基金经理在该指标上超过美国同业的3倍有余. 据统计,428只主动管理型偏股基金2011年的整体平均换手率为214.04%,仅低于2008年,自2009年以来连续3年下降.其中,401只开放式基金的平均换手率为215.51%,较去年降低了13.6%. 笔者认为,基金换手率水平下降与A股连续下跌无机会密

荣盛石化估值困惑还是名字惹的祸?

11月2日,荣盛石化(002493,收盘价61.99元)登陆中小板,首日涨幅17.57%.昨日,荣盛石化在短暂冲高后,尾市随大盘狂泻,收盘下跌1.99%.上市两日,荣盛石化的表现只能用平庸来形容.目前,荣盛石化的市盈率仅26倍,不但在化工化纤板块中垫底,也是今年以来中小板次新股中当前市盈率最低的. <每日经济新闻>发现,机构对于荣盛石化的合理价格产生了极大的分歧,从看高89元到看低31元,合理估值价差竟高达近2倍.为何荣盛石化引来这么大的分歧,难道是其名字中带有"石化"所产

排名掉了都是SEO惹的祸

昨天晚上(10月20日凌晨)咱们中文搜索引擎龙头老头--百度,给咱们的站长来了一次继6月14日后第二次大更新,此次大更新在排名和收录数据上都有相当大的"反应". 今天一整天(恐怕最近几天也是)各大站长论坛看见的全是关于昨夜百度更新的话题,当然最多的还是抱怨声,只有小部分站长排名"也许"升了在那里乐呵着. 不论是大更新,还是逢周三.周四的小更新,站长论坛里总会看到很多讨论百度排名掉了的问题,许多掉了排名的站长都会说百度出问题了.百度抽疯了.百度今天怎么了.百度到底想干

博客百度快照停留都是服务器惹的祸

这几天对情侣seo来说真是伤筋动骨,快照停留在7.10了,都是服务器惹的祸啊.细心的朋友可能会发现本站昨天以前的三天都不能访问,很多朋友问我why?当时我只能嫣然面对说:"机房服务器在调整."可是一'调整'就是3天,对咱打击够大的.其实蛋蛋在前天,也就是服务器不能访问的3天的最后一天才知道事情的经过,真是无语. 因为当初不想备案,就买了国外主机.正好那段时间我女友和柳亚还算熟悉,就买了她的全来主机.刚开始确实不错的,后来也有点小问题,不过找她后很快就能解决.其实柳亚还算很不错的一个主机

解密Google Chrome兼容性缺陷:都是网页开发者惹的祸

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 Google Chrome浏览器在推出之后就以简洁.快速的特性吸引了一干G粉的青睐.但是在试用之后,有不少网友抱怨Chrome兼容性不佳,甚至与Google旗下的YouTube都无法兼容. 这一方面是由于Chrome还是测试版.按照Google的习惯,测试版总是有这样那样的缺陷,只有一路beat下去,才会越来越臻于完美.而另一方面,所谓的兼容

大学生就业难都是教育结构惹的祸

大学生"就业难"已成为牵动社会公众神经的敏感议题,广东省劳保厅发布的2008年上半年人力资源市场供求调查报告,认为新成长失业青年近半是大学生,毕业意味着失业,这样的现象可能还会在一定范围内持续,似乎大学生成为"就业第一难". 大学生就业困难首先要厘清三层次概念:一是整体还是部分就业难?从中国现状来看,难以得出大学生过多的结论.二是为什么有的学校学生如部分高职院校学生供不应求,而另外一些专业学生长期供过于求?三是为什么大学生千军万马挤公务员事业单位独木桥,而真正愿意到