JavaScript变量的作用域&是否有var 的区别

“JavaScript对变量作用域的规定是:
- 变量在全局声明,或者在代码的任何位置隐士声明(不用var),则该变量在全局可见
- 变量在函数内显示申明(使用var),则在该函数内可见”

今天在修改一个前台bug的时候,遇到一个问题。我想通过sbflag控制实现不会点击id为EditBtnOk的按钮后多次进入到function ()进行Submit操作。则希望在执行完一次后就将sbflag置为false。但是事实是虽然在执行 sbflag = flag时,sbflag为false,但是第二次进入到function后,sbflag又会变为true。

代码如下:

            var sbflag = true;//该标志位位需要关注的变量
                $('#EditBtnOk').click(function () {                    
                    if (sbflag==true) {
                        $.ajax({
                            url: '../Submit',
                            type: 'post',
                            traditional: true,
                            data: {
                                App_id: Appid,
                                Details: Details
                                //Bank_To: Bank_To,
                                //Bank: Bank,
                                //Account:Account
                            },
                            beforeSend: function () {
                                //Ajax完成前(控制器处理过程中),显示进度条
                            },
                            success: function (data) {
                                //关闭进度条
                                var serverData = data.split(';');
                                if (serverData[0] == "ok") {
                                    //在前端修改数据
                                    }
                                } else if (serverData[0] == "no") {
                                    //显示错误信息
                                }
                            }
                        })
                        sbflag = flag;
                    }
                })

我查阅了下面链接所讲的js作用域后,有所感悟。发现了js是以函数作用域的,而不是如常见的语言如c语言一样是块级作用域。可以用两个例子来说明
example1:

var name="global";  
if(true){  
    var name="local";  
    console.log(name)  
}  
console.log(name);

输出均为local这可以表明不是块级作用域,否则全局变量不会被覆盖掉。

在很多JavaScript编程人员的印象中,定义变量用var和不用没有区别,但实际是存在差异的:

  • 如果使用var定义变量,那么程序会强制定义一个新变量(及时变量名相同)。
  • 如果没有使用var定义变量,系统会有优先在当前上下文中搜索是否存在该变量。只有在该变量不存在的前提下,系统才会重新定义一个新变量。

example2

var flag=true;
    if(flag){ 
    function t(){  
        flag=false;  
    }  
    t();
    console.log(flag);  //结果为false
}
var flag1=true;
    if(flag1){ 
    function t(){  
        var flag1=false;  
    }  
    t();
    console.log(flag1);  //结果为true
}

注意有一种特殊情况,就是如果函数的参数名和全局变量相同的话,在函数内部不写var,里面的变量会认为是形参的调用,而不会覆盖全局变量:

var flag=true;
    function t(flag){  
        flag=false;  
    }  
    t();
    console.log(flag);  //结果为true
}
   以前看《深入理解JavaScript》的时候没有对这个概念进行深入理解,这次就不会忘了。希望大家以后也注意一下这个陷阱。想要更系统看一下js作用域可以看以下链接

js作用域与作用域链详解

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值