zoukankan      html  css  js  c++  java
  • 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'

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

     
  • 相关阅读:
    3种方式提高页面加载速度
    CSS中的层叠、特殊性、继承、样式表中的@import
    jQuery从零开始(二)
    jQuery从零开始(一)
    设计模式
    Vue-cli3脚手架工具快速创建一个项目
    Git上传到码云及其常见问题详解
    eclipse导入本地的svn项目后不能在team提交更新
    js拖拽上传图片
    axure 动态面板制作图片轮播 (01图片轮播)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10223112.html
Copyright © 2011-2022 走看看