最基本的var关键字是上下文的,而不采用var是全局的这就不讨论了

  “不管是使用var关键字(在全局上下文)还是不使用var关键字(在任何地方),都可以声明一个变量”。这貌似一个错误的概念:任何时候,变量只能通过使用var关键字才能声明。

a = 10;是一个赋值语句,仅仅是给全局对象window创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”。

 alert(a); // undefined
alert(b); // b is not defined -->报错"b" 没有声明
b = 10;
var a = 20;

  我们可以看到,因为“b”不是一个变量,所以在这个阶段根本就没有“b”,“b”将只在代码执行阶段才会出现(但是在我们这个例子里,还没有到那就已经出错了)。

让我们改变一下例子代码:

 alert(a); // undefined, 这个大家都知道,
b = 10;
alert(b); // 10, 代码执行阶段创建
var a = 20;
alert(a); // 20, 代码执行阶段修改

  其实就是变量声明提升的一个概念:第一个例子相当于这个

 var a;
alert(a); // undefined
alert(b); // b is not defined -->报错"b" 没有声明
b = 10;
a = 20;

  关于变量,还有一个特性就是不能用delete操作符直接删除变量属性。

 //window的属性可以直接删除
a = 10;
alert(window.a); //
alert(delete a); // true
alert(window.a); // undefined
//变量不能被删除
var b = 20;
alert(window.b); //
alert(delete b); // false
alert(window.b); // still 20

  但是这个规则在有个上下文里不起走样,那就是eval上下文,变量没有{DontDelete}特性。

 eval('var a = 10;');
alert(window.a); //
alert(delete a); // true
alert(window.a); // undefined

不使用var定义变量和使用var的区别的更多相关文章

  1. es6的let与es5的var定义变量的区别

    es6的let与es5的var定义变量的区别 自身新手第一次接触let关键字的时候,不知道let与var的区别,本能认为是一样,但非如此,比如下述的代码运行就会报错: let hello = 'hel ...

  2. JavaScript 中定义变量时有无var声明的区别

    关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...

  3. C#使用var定义变量时的四个特点

    使用var定义变量时有以下四个特点: 1. 必须在定义时初始化.也就是必须是var s = “abcd”形式: 2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了. 3.   var要求是 ...

  4. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  5. var定义变量的使用细节

    js中定义一个变量可以加关键词var也可以不加,规则是这样的: 1.       在全局范围内用不用var都可以,变量都是全局的 2.       在局部范围内比如函数中,用不用var是不一样的,用v ...

  6. let 和 var 定义变量的区别

    一.变量提升 var 存在变量提升,而 let 不存在变量提升,所以用 let 定义的变量一定要在声明后再使用,否则会报错. var //var定义的变量存在变量提升,变量会把声明提升到整个作用域的最 ...

  7. 数据可视化之DAX篇(八) DAX学习:使用VAR定义变量

    https://zhuanlan.zhihu.com/p/64414205 前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. ...

  8. jdk10 var定义变量的由来

    百家号03-1714:11 题图:by jordhammond from instagram 本文选自聊聊架构公众号,略有修改 以前我们 Java 程序员经常会对其他语言中的 var 关键字耿耿于怀, ...

  9. javascript的var声明变量和不用var声明变量在全局作用域的区别;

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

随机推荐

  1. 【翻译】运行于x86机器上的FreeBSD的PCI中断

    来源 http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/article.html 摘要 在拥有多个独立设备的计算机里一个重要的元素是一 ...

  2. Matlab GUI界面

    做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     ...

  3. Docker系列(八)Kubernetes介绍

    Kubernetes组件功能图   各组件说明: 节点 节点在Kubernetes由虚拟机或者实体机表示,常称为Minion,即从属主机.当一个节点加入到Kubernetes系统中时,它将会创建一个数 ...

  4. Spark环境的搭建与运行

    Spark本地安装与配置 下载spark后解压,并cd到解压目录下 运行实例程序测试是否一切正常 ./bin/run-example org.apache.spark.examples.SparkPi ...

  5. HW6.5

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. C++学习笔记(五):指针和引用

    声明指针: //指针声明 * 号左右的空格是可选的,下面的定义都是正确的 int *pointer1; int* pointer2; int*pointer3; int * pointer4; //注 ...

  7. Android开发日志问题

    以前在Android开发中发现,日志打印好多,调试的时候各种加Log,之后就各种不删除,导致项目后期花大把时间删除日志打印. 学到一个好方法: 在所有尽可能高的父类里面加上一个常量 DEBUG ,一开 ...

  8. cocos2d-x 纹理研究

    转自:http://blog.csdn.net/qq51931373/article/details/9119161 1.通常情况下用PVR格式的文件来进行图片显示的时候,在运行速度和内存消耗方面都要 ...

  9. PowerShell远程安装应用程序

    安装MSI包 使用PowerShell调用WMI对象,你可以执行下面的脚本来安装你的MSI安装包: $box="deviis01" #this is the name of you ...

  10. 常见排序算法及其java实现

    最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...