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

来源:互联网 发布:pe远程控制软件 编辑:程序博客网 时间:2024/04/29 14:28

“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作用域与作用域链详解

1 0