微信扫一扫打赏支持

js 变量声明 (var使用与不使用的区别)

js 变量声明 (var使用与不使用的区别)

一、总结

一句话总结:不使用var声明变量的时候,变量是全局对象(window对象)属性,在全局中使用var声明变量是全局变量

var 全局变量 局部变量
不使用 var 全局对象属性

 

1、js变量作用域有哪两种?

全局 函数

全局作用域

函数作用域:函数作用域中无法访问全局变量

 

2、使用一个没有声明的变量的时候,js什么时候会报错,什么时候隐式声明?

访问 报错
赋值 隐式声明

当我们使用访问一个没有声明的变量时,JS会报错;而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式声明一个全局变量,这一点一定要注意。

 

3、不使用var声明变量的时候,变量是全局对象(window对象)属性,在全局中使用var声明变量是全局变量,那么全局对象属性和全局变量的区别是什么?

var 全局变量 不可 delete运算符 删除
全局对象属性 可 删除

事实上,Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。

由于变量声明自带不可删除属性,比较var name = 'muzidigbig' 跟 name = 'muzidigbig'

,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。

 

当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除

var name=1 ->不可删除

sex=”girl“ ->可删除

this.age=22 ->可删除

 

4、js赋值操作的实质是什么?

查找 解析 赋值
window 属性 赋值

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

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

 

5、使用var声明变量时,生成变量的两种情况?

函数 全局

在当前域中声明变量.

如果在方法中声明,则为局部变量(local variable);

如果是在全局域中声明,则为全局变量。

 

6、js创建的变量常见的有哪三种?

局部 全局 全局对象属性

局部变量:函数内 var定义的变量

全局变量:全局 var 定义的变量

全局对象属性:隐式声明的变量

 

 

 

 

二、js 变量声明 (var使用与不使用的区别)

一、区分显示的声明与隐式声明(var)

JS中变量声明分显式声明和隐式声明。

var name = 'muzidigbig';//显示声明 
name = 'muzidigbig';//隐式声明(为全局变量的一个属性)

函数中使用var关键字进行显式声明的变量是做为局部变量,在全局范围内声明的变量为全局变量;而没有用var关键字,使用直接赋值方式声明的是全局变量(全局对象属性)

//    name = 'muzidigbig';//隐式声明(为全局变量的一个属性)
    console.log(name);
    function  person(){
        name = '木子大大';
        console.log(name);
    }
    person();

 

当我们使用访问一个没有声明的变量时,JS会报错;而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式声明一个全局变量,这一点一定要注意。

name = 'muzidigbig';//隐式声明(为全局变量的一个属性)
console.log(name);
function  person(){
    name = '木子大大';
    console.log(name);//木子大大
}
person();

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


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

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

 

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

由于变量声明自带不可删除属性,比较var name = 'muzidigbig' 跟 name = 'muzidigbig'

,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。

 

 

 
posted @ 2019-01-05 00:00  范仁义  阅读(4192)  评论(0编辑  收藏  举报