关于JavaScript中定义变量时有无var声明的区别

var a=5;    //正确

a=5;    //正确

  在javascript中,以上两种方法都是定义变量的正确方法。微软的Script56.CHM中是这样解释的:

  尽管并不安全,但声明语句中忽略 var 关键字是合法的JS语法。这时,JS 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围,这种情况下,变量声明必须用 var 关键字。

  

从上面的描述看来,对待这两种定义方法要区分以下两种情况:

1.在一个过程级中(即位于function的定义范围内,无论是函数,还是类)的任何地方,包括在一个区块里(for,while,if……),定义变量时,使用var定义,则此变量只在这个过程级内起作用,反之为全局变量。

2.在过程级外定义变量时,无论是否忽略var,都将定义一个全局变量。

从这点看来,JS和其他语言有不一样的地方,变量的范围不以“{}”作为边界,而是以”function(){}”为边界,而且在过程内可以很轻松的定义全局变量。如果不注意这个问题的话,是很容易产生不可预知的错误的。

  

  区别一:在函数作用域内 加var定义的变量是局部变量(在方法内),不加var定义的就成了全局变量。

  例1:变量使用 var 定义:

<script>
var a="hello world";
function test1(){
var a="hello sxl";
alert(a);
}
test1(); //输出“hello sxl”
alert(a); //输出“hello world” ,或者无定义var a="hello world";时,无输出
</script>

  例2:变量不使用 var 定义:

<script>
var a="hello world";
function test2(){
a="hello sxl";
alert(a);
}
test2(); //输出“hello sxl”
alert(a); //输出“hello sxl”
</script>

  例3:

  <script type="text/javascript">
var gobal="global";
var a=10;
test3(); //1.输出顺序: gobal,local
function test3(){
var local="local";
alert(gobal);
alert(local);
}
alert(a); //2.输出: 10
alert(local); //3.无输出 ,但若是把 test3() 方法内的 var local="local"; 的 var 去掉,则输出local
</script>

  在上面的test3方法内,当把local变量的var去掉后,local就变成了全局变量,但是在局部不使用local,则这个local作为全局是无效的。

  为了验证这点,我把test3方法内部唯一使用local变量的这句代码注释掉.发现在外部也打印不出来了。如下代码所示:

  例4:

   <script type="text/javascript">
var gobal="global";
var a=10;
test4(); //结果只输出一个 “global”
function test4(){
// local="local";
alert(gobal);
alert(local);
}
alert(a); //无输出
alert(local); //无输出
</script>

  总结:全局变量可以不声明var 函数内变量必须声明var,在定义全局变量时加或不加var关键字没什么影响;但在定义局部变量时如果不加var关键字javascript解释程序会将其解释为全局变量。

  

  区别二:在全局作用域下,使用var定义的变量不可以delete,没有var 定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。

  区别三:使用var 定义变量还会提升变量声明,如:

  例5:变量使用 var 定义:

  <script type="text/javascript">

       function test5(){
console.log(a);
var a="hello JavaScript ";
}
test5(); // 控制台:“undefined”
</script>

  例6:变量没有使用 var 定义:

 <script type="text/javascript">

       function test6(){
console.log(a);
a="hello JavaScript ";
}
test6(); // 控制台上:“Uncaught ReferenceError: a is not defined”
</script>

这就是使用var定义的变量的声明提前。

  区别四:在ES5的'use strict'模式下,如果变量没有使用var定义,就会报错。

 

变量作用域的规则如下:

1.如果在函数或代码块中使用var 关键字声明一个变量,那么这是一个属于这个函数或代码块的局部变量;

2.如果使用一个没有用var 关键字声明的变量,并且存在同名的全局变量,那么该局部变量将等同于已经存在的全局变量;

3.如果使用var 关键字在局部声明一个变量,但是没有对变量进行初始化(即为变量赋值),那么它是个局部变量,但是它是未定义的;

4.如果在局部声明变量时没有使用var关键字,或者显式地声明为全局变量,但是没有初始化它,那么它是一个可以全局访问的变量,但是也是未定义的。

(——《JavaScript 学习指南》Shelley Powers 著)

参考:http://www.jb51.net/article/53909.htm

尽管并不安全,但声明语句中忽略 var 关键字是合法的 JScript 语法。这时,JScript 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围;这种情况下,变量声明必须用 var 关键字。

JavaScript 中定义变量时有无var声明的区别的更多相关文章

  1. (转载)JavaScript中定义变量

    (转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...

  2. 在php中定义常量时,const与define的区别?

    问]在php中定义常量时,const与define的区别?  [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  3. JavaScript中定义变量和存储值的类型判断

    以严谨的语法表示作为前提 首先变量被定义,然后给变量赋予一定的值,变量真正的作用就是存储值 变量的定义和赋值 变量的定义: var a 使用关键字var+变量名表示定义一个变量 a 变量的赋值: va ...

  4. 015、Java中定义变量时不设置内容,使用变量前设置内容

    01.代码如下 package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. 十三、SAP中定义变量时赋初始值

    一.代码如下 二.输出如下

  6. JavaScript基础——定义变量

    在JavaScript中使用变量来临时存储和访问来自JavaScript文件的数据.变量既可以指向简单的数据类型,如数字或者字符串:也可以指向更复杂的数据类型,比如对象. 在JavaScript中定义 ...

  7. PHP中定义常量的几种方式与区别

    [问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  8. JavaScript 中对变量和函数声明提前的演示样例

    如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...

  9. Java定义bean实体类中的变量时变量名的问题

    首先:TMD,这个问题花了我两个多小时,居然是因为一个字母的大小写导致的,我瞬间就&Y^%^&%&()*%¥%¥¥&^#@%&; 事情是酱紫的: 我定义了一个变 ...

随机推荐

  1. [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式

    reference : http://www.suyunyou.com/aid1657.html jQuery是继prototype之后又一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后 ...

  2. 操作系统Day1地址空间与地址生成

    1.地址空间分成(1)物理地址空间 (2)逻辑地址空间二者之间的关系:*逻辑地址空间的生成:程序——>汇编-->linker——>loader*物理地址的生成:内存的逻辑地址空间会有 ...

  3. 第八章 JVM性能监控与故障处理工具(2)

    注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...

  4. Typescript declaration: Merge a class and an interface

    参考: https://stackoverflow.com/questions/47670959/typescript-declaration-merge-a-class-and-an-interfa ...

  5. lua接收图片并进行md5处理

    需要luacurl(http://luacurl.luaforge.net/)和MD5两个库函数 curl = require("luacurl") require("m ...

  6. ArcGIS中的查询

    最近身体不适,静下心来看了一下以前收集的电子书.下面是<ArcGIS地理信息系统教程_第5版>(李玉龙)第5章“查询”的读书笔记. 1.查询的常见应用: 选择感兴趣的要素:查找哪些要素满足 ...

  7. WPF 同一个程序 只允许 同时运行一个

            方法2  当程序已经运行了 再运行这个程序时,则显示当前这个窗体  http://code.3rbang.com/cshape-run-one/ VS2013附件:http://fil ...

  8. 【Linux】通过SSH修改调整Linux时间和时区

    VPS(Virtual Private Server 虚拟专用服务器)技术,将一部服务器分割成多个虚拟专享服务器的一种服务.大多站长喜欢用美国的VPS,而美国的时间和时区和国内不同,那就需要通过SSH ...

  9. PHP 表单 - 3(PHP 表单 - 必需字段)

    PHP 表单 - 必需字段 本章节我们将介绍如何设置表单必需字段及错误信息. PHP - 必需字段 在上一章节我们已经介绍了表的验证规则,我们可以看到"名字", "E-m ...

  10. secureCRT简单设置(学习笔记二)

    菜鸟记录. 一.更改终端类型 选项-全局选项-默认会话-编辑默认设置-终端-仿真-右侧选择类型,下方设置缓冲区大小 二.设置字体和外观 上方窗口外观-右侧设置-字体设置字体类型大小,下面光标可以设置光 ...