zoukankan      html  css  js  c++  java
  • 学习javascript中的细节总结

    一、( . )点操作符 与( [ ] ) 方括号操作符

    (一)( . )点操作符

    var earth = person.name; //得到person对象的name属性

    点操作符的右侧是一个以属性名称命名的标识符,标识符是静态的。

    (二) [ ] 方括号操作符

    var earth = person['age']; //得到person对象的age属性

    方括号操作符的内部是一个返回结果为字符串的表达式,该字符串就是属性的名字。严格来说表达式必须返回字符串或一个可以转换为字符串的值。

    由于字符串值是动态的,所以可以再运行时更改。


    二、变量、函数作用域及作用域链

    (一)变量作用域

    变量的作用域取决于定义变量的位置,就像在全局中定义的变量,那他的作用域就是全局作用域。如果一个变量在函数内定义,那么这个变量就是局部作用域,作用于这个函数体内,值得一提的是函数的参数也属于局部变量。

    (二)函数作用域

    函数的作用域指在该函数体内声明的变量,在该函数体内是始终可以看见的。

    介于定义的函数方式有两种,一种是函数声明,一种是函数表达式。这里对函数声明的定义方式进行说明。

    函数声明有一个很重要的特征,那就是函数声明提升、函数内的变量声明提前。

    var scope = 'global';
    origin();
    function origin(){
        console.log(scope);
        var scope = 'local';
        console.log(scope);
    }

    函数声明提升指的是在执行代码前,会先读取函数声明,所以把调用它的语句放在函数前面也依然可以得到执行。

    函数声明提前指的是在函数内,会将所有的变量声明提前到函数内的最上部,但只是此时的变量只是声明了,并未赋值。

    执行函数时,在origin函数内的第一个console.log会打印undefined,这是因为scope变量的声明提到了console.log前,但未赋值,所以显示undefined。只有真正执行到了变量所在行时,才会为其赋值,所以第二个console.log会打印出‘local’(声明了一个全局变量scope,在函数内部也声明了一个局部变量scope。在函数执行时,遇到两个同名的变量,局部变量就会覆盖全局变量)。

    (三)作用域链

    函数的作用域链有两种状态,一种是函数定义时,一种是调用函数时。

    表示变量的对象被称为变量对象。

    函数定义时,会创建一个包含全局变量对象(全局对象)的作用域链,这个作用域链被保存在函数的内部属性[[scope]]中。

    当函数被调用时,就会创建一个执行环境,将该函数内的arguments属性和参数放入活动对象内(局部对象),此时这个活动对象位于作用域链的第一个,再将包含该函数的外部函数的全局变量对象放在作用域链的第二个。所以这就是为什么在函数内部就可以访问到函数外部变量的原因,如下图。

  • 相关阅读:
    树上启发式合并_训练总结+题目清单
    Wannafly Day2 E 阔力梯的树(树上启发式合并)
    profile(/etc/profile)和bash_profile的区别
    MacOS配置.bash_profile,重启终端后配置失效和MacOS .zshrc does not exist问题
    Markdown入门学习202004
    把-图片的链接-下载到本地(服务器);
    前端Vue- v-for 循环中删除 元素;
    关于谷歌浏览器(Chrome)前端JS方法调用方法,运行顺序出错问题;
    国外的api之ASANA-java开发-ASANAAPI(真难!)
    vue脚手架3.x完整版
  • 原文地址:https://www.cnblogs.com/pine-cone/p/9020554.html
Copyright © 2011-2022 走看看