JavaScript中用var和不用var的区别

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)。在严格模式中,为未声明的标识符赋值将会抛引用错误,所以能够防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

 

JavaScript中用var和不用var的区别
相关文章
相关标签/搜索