`
Everyday都不同
  • 浏览: 714467 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

一种导致js全局变量访问不到的情况

    博客分类:
  • jsp
阅读更多

大家都知道,js全局变量是每个js函数都能访问和改变其值的,它的作用范围也是整个js文件。但是最近我却碰到一种情况导致全局变量在某个“角落”访问不到,很郁闷。但是却是一个值得注意的小细节,记录下吧。

<html>
    <head>
    <script src="jquery-1.8.3.min.js"></script>
    <script>
        var dimen = 'day';//全局变量
        $(function(){
            //console.log("dimen:" + dimen);
            
            $("#btn").click(function() {
                alert(dimen);
            });
            
            if(false) {
                var dimen = 'good';
            }
        });

        function change() {
            dimen = $("#time").val();//改变全局变量
            //some code....
        }
    </script>
        
    </head>
    
    <body>
        <input type="button" value="测试" id="btn" />
        <select id="time" onchange="change()">
            <option value="year">年</option>
            <option value="year">月</option>
            <option value="year">日</option>
        </select>
    </body>
</html>

 这个页面上点击“测试”按钮你会发现直接弹出undefined,奇怪的是dimen不是全局变量吗怎么会访问不到呢?

 

仔细检查你的$(function(){})函数里面的这段代码:

 if(false) {
       var dimen = 'good';
}

 你会发现你又重新定义了一个局部变量dimen,和全局变量重名了,这导致dimen瞬间变成局部变量而外部访问不到了。经测试,只有你在$(funciton(){})里这样定义一个跟全局变量重名的局部变量,才会出现这种情况!!

虽然是个小问题但也是我工作中遇到的,顺便提下还是需要多多注意这种比较隐晦的情况。。

分享到:
评论

相关推荐

    vue项目中定义全局变量、函数的几种方法

    前言 在项目中,经常会复用一些变量和函数,比如用户的登录token,用户信息等。...1、使用全局变量专用模块,挂载到main.js文件上面 全局变量模块Global.vue定义如下: const token='12345678'; const use

    探讨JavaScript中声明全局变量三种方式的异同

    这是第一种方式声明全局变量。 方式2 test = 5;没有使用var,直接给标识符test赋值,这样会隐式的声明了全局变量test。即使该语句是在一个function内,当该function被执行后test变成了全局变量。 方式3 window.test;...

    javascript闭包的理解

    没有定义到任何函数中的变量为全局变量,在函数中定义的变量为局部变量,注意在函数内部定义变量时一定要使用var关键字,不带var关键字的变量为全局变量。 javascript中每一段代码都有与之关联的作用域链,这个作用...

    JavaScript经典实例

     6.10使用匿名函数包装全局变量  第7章处理事件  7.0简介  7.1检测页面何时完成载入  7.2使用Event对象捕获鼠标点击事件的位置  7.3创建一个通用的、可重用的事件处理函数  7.4根据修改的条件来取消一个事件 ...

    js实现序号递增,嵌入到可执行的html,并给出注释

    在JavaScript中,可以使用全局变量或闭包的方式实现序号的递增,从而保证每个编号都是唯一的。 在上述回答中,我们使用了闭包的方式来实现序号递增。闭包是JavaScript中一种非常重要的概念,它允许在函数内部创建一...

    JS匿名函数、闭包

    匿名函数,也称为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了匿名函数的特点: 任何函数表达式从技术上说都是匿名函数,因为没有引用它们的确定的方式; 在无法确定如何引用函数的情况下,递归...

    javascript入门笔记

    Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 JS解释器/引擎 是JS的运行环境: 1、独立安装的JS解释器 - NodeJS 2、嵌入在浏览器中的JS解释器 JS的发展史: 1、1992年 Nombas 开发...

    大名鼎鼎SWFUpload- Flash+JS 上传

    它结合了FLASH和JavaScript的功能,以提供一种超越了传统的浏览器中标签提供的文件上传功能。 SWFUpload提供的主要功能: 在文件选择对话框中能够进行文件多选 页面无刷新的上传 提供上传进度的事件回调,实时...

    React 328道最全面试题 & 个人作答

    针对第一点,Context API、全局变量加发布订阅的模式都可以解决,但是上面提到的方式又一个缺点,当子组件可以任意调用,以此来改变全局状态时,需要一种机制去限制,让修改数据、获取数据通过统一的状态管理器去做...

    如何修改Vue打包后文件的接口地址配置的方法

    1、背景 常规的vue项目分为本地环境和生产...1)在static上设置一个config.js,把配置的参数设置成 window 下的全局变量。这种方案的确可行,但是,但是,不安全!!! 如果请求地址被恶意修改,后果不太好~ 2)使用

    jswr:JavaScript Weirdifier

    JSWR是一个小程序来展示JS多么奇怪一种混淆工具,可以从数字或字符串生成完全有效且不可读的代码在examples.md查看examples.md这个怎么运作? 你需要jswr.js (或meta.js如果你想在巨大的模糊版本-你可能不这样做,...

    闭包以及闭包的应用详解

    自己的闭包理解:闭包只是一种现象 ,内部函数可以使用外部函数环境中的变量,什么时候会产生闭包的现象呢 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。 function f1(){ ...

    javascript学习笔记.docx

    写未声明的变量会是JavaScript环境自动产生一个全局变量。 2) 对于完全等同“===”,两个null或者两个undefined是等同的;但null与undefined是不等同的。 3) 对于相等“==”, null与undefined是相等的。若值与对象...

    JavaScript笔记

    4.变量:js中的变量不需要提前指定类型,由赋值时动态决定 所有的变量都用var声明 5.数据类型: |--String(字符串类型) |--Number(数字类型) |--Boolean(布尔类型)0、-0、null、""、false/undefined或NaN,则该...

    详解javascript中的变量提升和函数提升

    1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域。 首先来解释一下什么是没有块级作用域? 所以此时 是可以打印输出变量a的值。 2:什么是变量提升? 在我们的js中,代码的执行...

    javascript真的不难-回顾一下基础知识

    如JS里在定义变量时,你要用var去声局部变量的声明,而对于弱类型的语言JS来说,你也可以不加var,但不加它会认为这个变量为全局变量,这是要注意的。变量 在程序运行过程中,其值可以发生改变的(呵呵,10多年前书...

    2010年 c语言入门到精通

     C语言中,变量分为全局变量和局部变量;也可以这样分:自动变量,静态变量.前者是按变量作用范围来分的,而后者是按变量存储方式来分的.  如果按存储占用空间来分,可以是整型变量,字符型变量,浮点型变量等.当然还有...

    receiptful:可接收JavaScript代码挑战

    我们认为这应该花费不到一个小时的时间来完成,但是请理解您可能还有其他承诺和时间限制。 编写一些代码,将任意嵌套的整数数组的平面展平为整数的平面数组。 例如[[1,2,[3]],4] -&gt; [1,2,3,4] 。 快速开始 将此...

    IE及IE6浏览器中判断JS文件加载成功失败的方法

    在网上看了一种解决方案是,在加载文件的最后置一个全局变量或改变标签的属性来区分,这样成功与否就通过这个标志位判断。但显然不太完美,还要改加载文件。 后来尝试另一种思路,先创建一个vbscript,src置成一个JS...

    javascript中作用域以及作用域链

    通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。 词法作用域: 词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变...

Global site tag (gtag.js) - Google Analytics