js中加“var”和不加“var”的区别,看完以为这么多年js白学了

http://www.javashuo.com/article/p-mpcavewn-cq.htmlhtml

 

 

Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,不少时候运行并无问题,可是这两种方式仍是有区别的。能够正常运行的代码并不表明是合适的代码。

var num = 1;浏览器

是在当前域中声明变量. 若是在方法中声明,则为局部变量(local variable);若是是在全局域中声明,则为全局变量。闭包

而 num = 1;函数

事实上是对属性赋值操做。首先,它会尝试在当前做用域链(如在方法中声明,则当前做用域链表明全局做用域和方法局部做用域etc。。。)中解析 num; 若是在任何当前做用域链中找到num,则会执行对num属性赋值; 若是没有找到num,它才会在全局对象(即当前做用域链的最顶层对象,如window对象)中创造num属性并赋值。code

注意!它并非声明了一个全局变量,而是建立了一个全局对象的属性。htm

即使如此,可能你仍是很难明白“变量声明”跟“建立对象属性”在这里的区别。事实上,Javascript的变量声明、建立属性以及每一个Javascript中的每一个属性都有必定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。对象

因为变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,所以没法被删除;后者为全局变量的一个属性,所以能够从全局变量中删除。blog

具体见如下代码:继承

 

复制代码代码以下:

// num1为全局变量,num2为window的一个属性

 

                     var num1 = 1;ip

                     num2 = 2;

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

相关文章
相关标签/搜索