`
GavinHsueh
  • 浏览: 71077 次
文章分类
社区版块
存档分类
最新评论

都是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的变量作用域和闭包等概念。

 

 

总结:

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

分享到:
评论

相关推荐

    javascript变量作用域

    JavaScript 还没有块级作用域,这意味着在 if 语句、for 循环、while 循环等语句块中定义的变量,在整个函数体内都是可见的,而不是只在语句块中可见。 在 JavaScript 中,函数中声明的变量在整个函数中都有定义。...

    深入理解JavaScript作用域和作用域链

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    JavaScript作用域示例详解_.docx

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性和生命周期。了解JavaScript作用域对于编写高效、安全的代码至关重要。本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数...

    关于JavaScript作用域你想知道的一切

    Javacript 中有一系列作用域的概念。对于新的JS的开发人员无法理解这些概念,甚至一些经验丰富的开发者也未必能。这篇文章主要目的帮助理解JavaScript中的一些概念如:scope,closure, this, namespace, function ...

    Javascript的词法作用域分析.pdf

    Javascript词法作用域分析 Javascript中的词法作用域分析是指变量的作用域不是在执行时决定的,而是在定义时决定的,也就是说通过静态分析就能确定。因此,词法作用域也叫做静态作用域。 在Javascript中,一个方法...

    JavaScript: 函数与作用域深入解析及应用场景

    接着讨论了 JavaScript 中的全局作用域、局部作用域、块级作用域和函数作用域,特别是闭包的概念。随后,文章探讨了函数的高级用法,如递归函数、高阶函数和立即执行函数表达式(IIFE)。最后,通过实际应用示例,如...

    再探JavaScript作用域

    js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到。 first try: 这是为什么呢?? var a = 10; function aaa(){//step-4 ...

    深入理解变量作用域

    - 在JavaScript中,每个执行上下文都有一个与之相关联的作用域链。作用域链是一个对象列表,用于存储变量和函数声明。 - 当JavaScript引擎需要查找变量时,它会从当前作用域开始,沿着作用域链向上查找,直到找到...

    JavaScript程序设计-变量作用域.pdf

    作用域链是JavaScript中实现作用域机制的一种方式,它是由一系列作用域构成的链状结构,每个函数都有自己的作用域链,用于在查找变量时提供路径。当尝试访问一个变量时,JavaScript会首先在当前作用域查找,如果没有...

    深入理解javascript作用域第二篇之词法作用域和动态作用域

    本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域  第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础  ...

    【温故而知新】JavaScript作用域.md

    【温故而知新】JavaScript作用域

    深入了解JavaScript,优化作用域链(2).pdf

    每次访问全局变量时,JavaScript引擎都需要遍历整个作用域链,直到全局对象,这无疑增加了查找时间。因此,在编程时应该尽量使用局部变量,以提高性能。 比如在例子中的函数toggle中,document.getElementById('btn...

    JavaScript 基础函数_深入剖析变量和作用域

    JavaScript是一种广泛用于网页开发的脚本语言,它的函数和作用域是实现代码逻辑结构和模块化的重要元素。在JavaScript中,函数是可执行的代码块,能够被多次调用,并且可以返回数据到调用它的地方。同时,变量作为...

    Javascript作用域和作用域链原理解析

    JavaScript中的作用域是编程中一个基础且至关重要的概念,它决定了变量在何处可被访问以及其可见性。简单来说,作用域就是变量的生存空间,它定义了变量的生命周期和可访问区域。理解作用域有助于编写更加高效、简洁...

    JavaScript:函数与作用域

    ### JavaScript:函数与作用域 #### 一、函数基础 **1.1 函数声明与表达式** 在JavaScript中,函数是一段可重用的代码块,用来执行特定任务。函数可以通过两种方式进行定义:函数声明和函数表达式。 - **函数...

    JavaScript — 原型链与作用域链1

    JavaScript 是一种广泛应用于Web开发的动态编程语言,其核心特性之一就是原型链和作用域链。这两个概念是理解和掌握JavaScript高级特性的基础。 首先,我们来深入探讨一下**作用域链**。作用域决定了变量在何处可以...

    js变量作用域

    ### JavaScript 变量作用域详解 #### 一、引言 在探讨JavaScript的面向对象特性之前,理解变量作用域的概念至关重要。本篇文章旨在通过一系列示例和解释,帮助读者掌握JavaScript中的变量作用域机制。 #### 二、...

    详解JavaScript作用域和作用域链

    JavaScript 中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是...

Global site tag (gtag.js) - Google Analytics