关于JS全局变量问题

关于JS全局变量问题最近在easyui使用全局变量的时候老是执行if判断语句,而不执行顺序下来的局部赋值。导致老是提示undefined;经网上查询得知JS全局变量时:当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{}来划分

大家好,又见面了,我是你们的朋友全栈君。

最近在easyui使用全局变量的时候老是执行if判断语句,而不执行顺序下来的局部赋值。导致老是提示undefined;经网上查询得知JS全局变量时:当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而不是for、while、if块并不是作用域的划分标准。所以第一次执行会按照同步全局变量执行一次。然后在在按照局部变量执行一次。如下面说明

<script>  
function test2(){  
    alert ("before for scope:"+i);    // i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)  
  
                                                    // 此时i的值是underfined  
    for(var i=0;i<3;i++){  
        alert("in for scope:"+i);  // i的值是 0、1、2, 当i为3时跳出循环  
    }  
    alert("after for scope:"+i);  // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3  
      
    while(true){  
        var j = 1;  
        break;  
    }  
    alert(j);    // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1  
  
    if(true){  
        var k = 1;  
    }  
    alert(k);  //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1  
}  
  
test2();  
//若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?  
alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!  
alert("这行打印还会输出吗?"); //未执行  
alert(j); //未执行  
alert(k); //未执行  
</script> 
二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。
[javascript] view plain copy
<script>  
    var a =1;  
    function test(){  
        alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,  
                     //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,  
                     //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。  
        a=4         
        alert(a);  //a为4,没悬念了吧? 这里的a还是局部变量哦!  
        var a;     //局部变量a在这行声明  
        alert(a);  //a还是为4,这是因为之前已把4赋给a了  
    }  
    test();  
    alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值  
</script>  

三,当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。

<script>  
    var a =1;  
    function test(){     
        alert(window.a);  //a为1,这里的a是全局变量哦!  
        var a=2;     //局部变量a在这行定义  
        alert(a);  //a为2,这里的a是局部变量哦!  
    }  
    test();  
    alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值  
</script>  

所以要ajax异步给全局变量赋值 async:false,

$('#menuTree').tree({
	formatter:function(node){
		if(node.text =="资源库"){
			var numbers ;
			$.ajax({
	  		   type: "POST",
	  		   url: basePath + "/main/getCount",
	  		   data: {},
	  		   async:false,
	  		   dataType: "text",
	  		   success: function(result){
	  			   var str = eval('('+result+')')
	  			 	numbers=str[0].count;
	  		   }
	     	});
			//==========		
			if(numbers!=0){
			    return node.text+'<span class="unread">'+numbers+'</span>';
			}else{
				return node.text;
			}
		}
		else{
			return node.text;
		}
	}
});

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136513.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在MySQL中如何使用覆盖索引优化limit分页查询

    在MySQL中如何使用覆盖索引优化limit分页查询

    2021年11月5日
    46
  • 前端调用rpc接口_api接口调用

    前端调用rpc接口_api接口调用问题背景需要根据id通过rpc调用查询具体信息,因为没有提供批量查询的接口,所以做法是挨个遍历查询,那意味着:如果有100个id,就需要顺序进行100次rpc调用,假设每次rpc接口的调用时间是50ms(这个速度很快了),那单单rpc调用就要占用5s,所以接口的响应会非常慢。下面进行优化。优化方案:方案一:让服务方提供批量查询接口,需要服务提供方配合,这里暂不采用。方案二:rpc服务的调用由顺序调用修改为并行调用,采用线程池实现rpc的并发调用。具体实现如下:1)创建线程的类public

    2022年10月11日
    3
  • sql删除或清空表数据[通俗易懂]

    sql删除或清空表数据[通俗易懂]sql删除或清空表数据一、sql清空表数据的三种方式:二、语法一、sql清空表数据的三种方式:我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:1、truncate–删除所有数据,保留表结构,不能撤销还原2、delete–是逐行删除速度极慢,不适合大量数据删除3、drop–删除表,数据和表结构一起删除,快速二、语法truncatetable表名deletefrom表名deletefrom表

    2022年4月30日
    53
  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:荡漾- blog.csdn.net/qq_38380025/article/details/105247548…

    2021年6月26日
    124
  • visdom API 方便使用查阅

    visdom API 方便使用查阅代码Structure如下:1、基础Visdom提供以下基本的可视化功能:vis.image:图片 vis.images:图像列表 vis.text:任意的HTML vis.video:视频 vis.svg:SVG对象 vis.save:序列化状态服务器端2、绘制我们已经封装了几种常见的绘图类型,以便轻松创建基本可视化。这些可视化由Plotly提供支持。目前支持…

    2022年6月17日
    39
  • 大型架构及配置技术之Ansible

    大型架构及配置技术之Ansible

    2021年6月9日
    96

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号