案件重现
今天有位然之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 还没有块级作用域,这意味着在 if 语句、for 循环、while 循环等语句块中定义的变量,在整个函数体内都是可见的,而不是只在语句块中可见。 在 JavaScript 中,函数中声明的变量在整个函数中都有定义。...
JavaScript作用域是编程中至关重要的概念,它定义了变量、函数和对象的可见性和生命周期。在JavaScript中,作用域主要分为两种类型:全局作用域和局部作用域。此外,随着ES6的引入,块级作用域和函数作用域也变得...
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...
JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性和生命周期。了解JavaScript作用域对于编写高效、安全的代码至关重要。本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数...
Javacript 中有一系列作用域的概念。对于新的JS的开发人员无法理解这些概念,甚至一些经验丰富的开发者也未必能。这篇文章主要目的帮助理解JavaScript中的一些概念如:scope,closure, this, namespace, function ...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript。 任何程序设计...
JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...
01JavaScript作用域.md
### JavaScript作用域链(Scope Chain)初探 #### 一、引言 JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域...
Javascript词法作用域分析 Javascript中的词法作用域分析是指变量的作用域不是在执行时决定的,而是在定义时决定的,也就是说通过静态分析就能确定。因此,词法作用域也叫做静态作用域。 在Javascript中,一个方法...
js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到。 first try: 这是为什么呢?? var a = 10; function aaa(){//step-4 ...
本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础 ...
【温故而知新】JavaScript作用域
每次访问全局变量时,JavaScript引擎都需要遍历整个作用域链,直到全局对象,这无疑增加了查找时间。因此,在编程时应该尽量使用局部变量,以提高性能。 比如在例子中的函数toggle中,document.getElementById('btn...
JavaScript是一种广泛用于网页开发的脚本语言,它的函数和作用域是实现代码逻辑结构和模块化的重要元素。在JavaScript中,函数是可执行的代码块,能够被多次调用,并且可以返回数据到调用它的地方。同时,变量作为...
ng-repeat指令的每个实例都有自己的作用域,但它们都会继承父作用域。 ng-view和ng-include指令用于在单页应用中动态地加载和渲染视图,它们也会创建新的子作用域。ng-view是SPA中用于定义路由的主要指令,它在视图...
JavaScript中的作用域是编程中一个基础且至关重要的概念,它决定了变量在何处可被访问以及其可见性。简单来说,作用域就是变量的生存空间,它定义了变量的生命周期和可访问区域。理解作用域有助于编写更加高效、简洁...