案件重现

今天有位然之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的变量作用域和闭包等概念。

总结:

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

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

  1. javascript方法重载惹的祸

    先贴出代码,看看执行结果会是什么? function ShowMsg() { //函数1 this.sure = function () { alert("ok"); }; //函 ...

  2. 你应该知道的数仓安全:都是同名Schema惹的祸

    摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸 本文分享自华为云社区<你应该知道的数仓安全--都是同名Schema惹的祸>,作者 ...

  3. 都是iconv惹的祸

    今天在做采集的时候发现只取到了网页的部分内容,当时我就郁闷了,之前都用的采集都可以采集到网页的所有内容,但这次死活就取到部分内容.寻找原因才知道原来是iconv惹的祸. 发现问题时,网上搜了搜,才发现 ...

  4. ie8 background css没有显示?——都是空格惹的祸

    ie8 background css没有显示?——都是空格惹的祸

  5. 都是SCI惹的祸?

    都是SCI惹的祸? 过去只知道地质学家需要跋山涉水寻找宝藏,最近同一位海外归来的学者谈起,方知少数其它领域的科研人员,也"跋山涉水",在内地研究机构寻找可以写好文章的研究成果,不管 ...

  6. 都是stm32的JTAG引脚惹的祸

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 最近在调试08接口的LED显示屏,使用的是自己做的STM32板子. ...

  7. JavaScript的作用域和块级作用域概念理解

    作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...

  8. 【ipv6惹的祸】curl 超时

    偶然发现 最近在公司日志平台 总是可以看到很多关于php curl的错误信息 Operation timed out after 0 milliseconds with 0 out of 0 byte ...

  9. 浅谈JavaScript的作用域

    前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好 ...

随机推荐

  1. Maven详解(六)------ 生命周期

    1.什么是 生命周期? Maven 强大的原因是有一个十分完善的生命周期,生命周期可以理解为项目构建步骤的集合,它定义了各个构建环节的执行顺序,有了这个顺序,Maven 就可以自动化的执行构建命令. ...

  2. Struts2流程分析与工具配置

    1. 运行流程 请求 -- StrutsPrepareAndExecuteFilter 核心控制器 -– Interceptors 拦截器(实现代码功能 ) -– Action 的execuute - ...

  3. java选择排序详解

    排序算法--选择排序 public class Selector implements ISortAble{ @Override public void sort(int[] a) { int n=a ...

  4. [2012-05-31]awk去重复项

    参考http://bbs.chinaunix.net/thread-2309494-1-1.html 10.awk '! a[$0]++' 怎么理解? 这是一个非常经典的去重复项的awk语句,虽然短小 ...

  5. 常用Dos操作指令

    1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出隐含文件. /w:以紧凑方式(一行显示5个 ...

  6. 实现一个简单的Laravel的dd库

    前几天写了一个简单的Laravel的dd库. 为什么自己要写一个这样的库? Laravel本身已经实现了自己的输出dd函数,但是我之所以要写这样一个库,一来是因为Laravel本身对这个库的封装没办法 ...

  7. ABP从入门到精通(6):快速重命名解决方案

    SolutionRenamer SolutionRenamer 是一个解决方案快速重命名工具.经测试重命名一个全新asp.net zero core项目(ABP asp.net zero,.net c ...

  8. 【小白成长撸】--Fibonacci

    /*程序的版权和版本声明部分: *Copyright(c) 2016,电子科技大学本科生 *All rights reserved. *文件名:Fibonacci *程序作用:计算菲薄拉稀数列 *作者 ...

  9. c# HttpWebRequest 模拟HTTP post 传递JSON参数

    //HTTP post   JSON 参数        private string HttpPost(string Url, Object ticket)        {            ...

  10. asp.net MVC下使用rest

    前言 最近做了下个MVC的项目,需要用到rest接口,与java写的应用程序通信,包括数据的接收和发送,那么我将用实用的角度来全面的讲解一下它的使用方法 一.创建rest服务 首先创建一个Asp.Ne ...