Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,不少时候运行并无问题,可是这两种方式仍是有区别的。能够正常运行的代码并不表明是合适的代码。
var num = 1;浏览器
是在当前域中声明变量. 若是在方法中声明,则为局部变量(local variable);若是是在全局域中声明,则为全局变量。闭包
而 num = 1;函数
事实上是对属性赋值操做。首先,它会尝试在当前做用域链(如在方法中声明,则当前做用域链表明全局做用域和方法局部做用域etc。。。)中解析 num; 若是在任何当前做用域链中找到num,则会执行对num属性赋值; 若是没有找到num,它才会在全局对象(即当前做用域链的最顶层对象,如window对象)中创造num属性并赋值。spa
注意!它并非声明了一个全局变量,而是建立了一个全局对象的属性。code
即使如此,可能你仍是很难明白“变量声明”跟“建立对象属性”在这里的区别。事实上,Javascript的变量声明、建立属性以及每一个Javascript中的每一个属性都有必定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。对象
因为变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,所以没法被删除;后者为全局变量的一个属性,所以能够从全局变量中删除。继承
具体见如下代码:ip
var num1 = 1;作用域
num2 = 2;it
// delete num1; 没法删除
// delete num2; 删除
function model(){
var num1 = 1; // 本地变量
num2 = 2; // window的属性
// 匿名函数
(function(){
var num = 1; // 本地变量
num1 = 2; // 继承做用域(闭包)
num3 = 3; // window的属性
}())
}
PS. 在ECMAScript5标准中,有一种“严格模式”(Strict Mode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,所以能够防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。