Javascript声明变量的,虽然用var关键字声明和不用关键字声明,不少时候运行并无问题,可是这两种方式仍是有区别的。能够正常运行的代码并不表明是合适的代码。前端
varnum=1;程序员
是在当前域中声明变量。若是在方法中声明,则为局部变量(localvariable),若是是在全局域中声明,则为全局变量。web
而浏览器
num=1;闭包
事实上是对属性赋值操做。首先,它会尝试在当前做用域链(如在方法中声明,则当前做用域链表明全局做用域和方法局部做用域etc。。。)中解析num,若是在任何当前做用域链中找到num,则会执行对num属性赋值,若是没有找到num,它才会在全局对象(即当前做用域链的最顶层对象,如window对象)中创造num属性并赋值。框架
我本身是一名从事了多年开发的web前端老程序员,目前辞职在作本身的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各类框架都有整理,送给每一位前端小伙伴,想要获取的能够关注个人头条号并在后台私信我:前端,便可免费获取。函数
即使如此,可能你仍是很难明白"变量声明"跟"建立对象属性"在这里的区别。事实上,Javascript的变量声明、建立属性以及每一个Javascript中的每一个属性都有必定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。学习
因为变量声明自带不可删除属性,比较varnum=1跟num=1,前者是变量声明,带不可删除属性,所以没法被删除;后者为全局变量的一个属性,所以能够从全局变量中删除。对象
Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,不少时候运行并无问题,可是这两种方式仍是有区别的。能够正常运行的代码并不表明是合适的代码。blog
varnum=1;
是在当前域中声明变量。若是在方法中声明,则为局部变量(localvariable),若是是在全局域中声明,则为全局变量。
而
num=1;
事实上是对属性赋值操做。首先,它会尝试在当前做用域链(如在方法中声明,则当前做用域链表明全局做用域和方法局部做用域etc。。。)中解析num,若是在任何当前做用域链中找到num,则会执行对num属性赋值,若是没有找到num,它才会在全局对象(即当前做用域链的最顶层对象,如window对象)中创造num属性并赋值。
注意!它并非声明了一个全局变量,而是建立了一个全局对象的属性。
即使如此,可能你仍是很难明白"变量声明"跟"建立对象属性"在这里的区别。事实上,Javascript的变量声明、建立属性以及每一个Javascript中的每一个属性都有必定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。
因为变量声明自带不可删除属性,比较varnum=1跟num=1,前者是变量声明,带不可删除属性,所以没法被删除;后者为全局变量的一个属性,所以能够从全局变量中删除。
//num1为全局变量,num2为window的一个属性
varnum1=1;
num2=2;
//deletenum1;没法删除
//deletenum2;删除
functionmodel(){
varnum1=1;//本地变量
num2=2;//window的属性
//匿名函数
(function(){
varnum=1;//本地变量
num1=2;//继承做用域(闭包)
num3=3;//window的属性
}())
}
最后:在ECMAScript5标准中,有一种"严格模式"(StrictMode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,所以能够防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。