美文网首页
JavaScript笔记-4

JavaScript笔记-4

作者: 蚂蚁踩死我 | 来源:发表于2019-03-26 15:35 被阅读0次

    作用域

    • 作用域决定了变量、常量和参数被定义的时间和位置
    • 形参只有在函数被调用的时候才变成实参,函数返回后参数就失去作用域
    • 变量和常量只有在创建后才存在,使用let、const声明前,他们是没有作用域的
    • var

    作用域和存在

    • 作用域

      • 当前可见并且可被正在执行的代码块访问的标识符

      存在

      • 保存了已经分配过内存的数据的标识符

    静态作用域与动态作用域

    JavaScript中,作用域是静态的

    • 静态作用域
      • 在某个作用域内定义函数,该作用域包含的所有变量也在该函数的作用域内。
      • 静态作用域适用于全局作用域、块作用域、函数作用域。

    全局作用域

    全局作用域中声明的一切在所有作用域中都可用,所以要谨慎使用全局变量

    块作用域

    Let 和 const 声明的变量名处在块作用域中

    变量屏蔽

    独立外部块的同名变量,屏蔽了外部块定义的变量

    const obj = {
            color: 'red'
          },
          objCopy = obj,
          number = 100;
    
    function fun() {
        const number = '一百';
    
        console.log(number);
        objCopy.color = '红色';
    }
    
    fun(); //一百
    console.log(number); //100
    console.log(obj); //{color: "红色"}
    console.log(objCopy); //{color: "红色"}
    

    函数、闭包和静态作用域

    • 闭包

      故意将函数定义咋一个指定的作用域中,并明确地指出它对该作用域具备访问权限

      let fun ;
      {
          fun = function(){
                console.log(color) ;
          } ;
          const color = 'red' ;
      }
      fun() ;
      

      闭包内定义的函数还允许访问一些正常情况下无法访问到的信息。

      let fun; 
      {
          const list = {};
      
          fun = function (name) {
                return list;
          };
      }
      
      const newList = fun();
      newList.color = 'pink' ;
      
      console.log(newList) ;//{color: "pink"}
      console.log(fun()) ;//{color: "pink"}
      console.log(list) ;//list is not defined
      

    即时调用函数表达式

    (function(){
        
        //代码
      
    }) () ;
    

    好处是,任何内部信息都有自己的作用域,并且因为它本身就是函数,它可以向作用域外传递信息。

    • 即时调用函数作用域内,变量是安全的,外部不能访问它。

    • 可以从即时调用函数返回任何想要的结果,笔记常见返回数组、对象、函数。

    • 可以打印出自己被调用的次数,而且不会被篡改

      const message = (function () {
      
            let sum = 0;
            const str = '又大又宽又圆';
      
            return function () {
      
                  console.log(`信息的长度是${str.length}, \n` +
      `你是第${++sum}获得提示的人。`);
              
            } ;
      
      })();
      
      message() ;//信息的长度是6, 
                         //你是第1获得提示的人。
      message() ;//信息的长度是6, 
                         //你是第2获得提示的人。
      message() ;//信息的长度是6, 
                         //你是第3获得提示的人。
      

    函数作用域和提升

    var 声明的变量,可在当前作用域的任意地方可用,甚至可以在声明前使用

    任何使用var声明的变量都会被提升到作用域顶部,提升不是赋值。

    /*
     *JavaScript解释下面代码的方式:
     *  
     *  var a ;
     *  var y ;
     *  console.log('第一次打印a :'+a) ;
     *  if(a !== 0){
     *      console.log('第一次打印b :'+b) ;
     *
     *      b = 1 ;
     *
     *        if(b){ a = 0 ;}
     * 
     *      console.log('第二次打印b :'+b) ;
     *  }
     * 
     *  if(a === 0) console.log('第三次打印b :'+b) ;
     */
    
    console.log('第一次打印a :'+a) ;
    
    if(a !== 0){
        console.log('第一次打印b :'+b) ;
    
        var b = 1 ;
    
        if(b){ var a = 0 ;}
    
        console.log('第二次打印b :'+b) ;
    }
    
    if(a === 0) console.log('第三次打印b :'+b) ;
    

    同一函数或全局作用域内,var不能用来创建新的变量,变量屏蔽现象也不会出现

    //使用var后,变量屏蔽现象不会出现
    var number = 1000 ;
    if(number === 1000){
        var number = 999 ;
        console.log(number) ;//999
    }
    console.log(number) ;//999
    
    //使用let
    let number = 1000 ;
    if(number === 1000){
        let number = 999 ;
        console.log(number) ;//999
    }
    console.log(number) ;//1000
    

    函数提升

    函数声明也会被提升至他们作用域的顶部

    临时死区

    在ES6中没有必要使用typeof来检查变量是否被定义

    严格模式

    代码第一行插入字符串"use strict"

    • 不建议在全局作用域使用严格模式,它会应用于所有代码,多人协作合并代码容易出错
    • 建议在单独函数中开启严格模式,或者将所有代码封装在一个立即执行的函数中。

    数组

    操作数组

    • 会修改原数组*

      方法 描述
      .push() 数组最后添加元素,return新数组长度
      .pop() 数组最后删除元素,return被删除的元素
      .shift() 删除数组第一个元素,return被删除的元素
      .unshift() 添加数组第一个元素,return返回新数组长度
      .reverse() 颠倒当前数组得顺序
      .sort() 对当前数组进行排序,接受一排序函数作为参数
      ES6新方法 描述
      .copyWithin 将数组中一段元素复制到数组得另一个位置,
      并覆盖此位置的原来元素,
      第一个参数 复制到哪
      第二个参数 从哪里开始复制
      (可选)第三个参数 复制多少个参数
      .fill() 将一个固定值赋值给数组中任意位置元素
      const arr = [1, 2, 3, 4];
      console.log(arr) ;//[1, 2, 3, 4]
      arr.copyWithin(2, 1, 3) ;
      console.log(arr) ;//[1, 2, 2, 3]
      arr.fill('a', -2, -1) ;
      console.log(arr) ;//[1, 2, "a", 3]
      
    • 不会修改原数组,返回新数组

      方法 描述
      .concat() 给数组添加多个元素,return新数组
      .slice() 获取数组得子数组,return子数组
      .filter() 比较麻烦,执行百度
    • 不会修改原数组,返回其他

      方法 -
      .indexOf() 返回和查找的内容完全相同的第一个元素下标,没找到返回-1,第二参数接受起始下标
      .lastIndexOf() 返回和查找的内容完全相同的倒数第一个元素下标,没找到返回-1,第二参数接受起始下标
      .findIndex() 接受一个匹配函数作为参数,返回查找到的元素下标,否则返回-1
      .findLastIndex() 接受一个匹配函数作为参数,返回查找到的元素下标,否则返回-1
      .find() 返回查找到的第一个元素本身
      .reduce() 自行百度
      //reduce用法
      const arr = [1, 2, 3, 4] ;
      //(a, el)回调函数参数,a为累加起始值(此处为100),el数组元素
      const b = arr.reduce((a, el) => a+el , 100) ;
      console.log(b) ;//110
      
      
      //reduce 进阶用法
      const arr = [
                  'Bosd',
                  'Go98',
                  'Ixj',
                  'Eoo',
                  'Ajv',
                  'Clsq',
                  'Avi',
                  'Fk.x',
                  'Cro2v',
                  'D0we',
                  'Ezxp',
                  'G3io',
                  'I-l'
              ] ;
              const newArr = arr.reduce((a, el) => {
                  if(!a[ el[0] ]) a[ el[0] ] = [] ;
                  a[el[0]].push(el) ;
                  return a ;
              }, {}) ;
              console.log(newArr) ;
      
              /*        
                  {
                      A: ["Ajv", "Avi"]
                      B: ["Bosd"]
                      C: ["Clsq", "Cro2v"]
                      D: ["D0we"]
                      E: ["Eoo", "Ezxp"]
                      F: ["Fk.x"]
                      G: ["Go98", "G3io"]
                      I: ["Ixj", "I-l"]
                  }
              */
      
    const arr = [
                1, 
                'a', 
                true, 
                {name: 'Tom'}, 
                null, 
                23, 
                'b', 
                {color: 'red'}, 
                false
            ] ;
            
    const a = arr.find(
      (el, i) => i > 2 && typeof el === 'object'
    ) ;
    
    console.log(arr) ;//[1, "a", true, {…}, null, 23, "b", {…}, false]
    console.log(a) ;//{name: "Tom"}
    
    • 即修改原数组,也返回新数组

      方法 描述
      .splice() 第一个参数修改元素位置
      第二个参数删除元素个数
      其他参数是添加到数组得元素
      return被删除的元素

    数组方法,已删除或者未定义的数组

    当数组中的元素未被赋值或已被删除,map,filter,reduce就不会调用所传入的函数。

    一般情况不会对数组使用delete,会造成数组缺口

    字符串连接

    Array.prototype.join()方法接受一个分隔符作为参数,返回一个连接了所有元素的字符串

    const arr = [1, 'a', true, undefined, null, NaN, {}, '', [] ] ;
    const a = arr.join('?') ;
    console.log(a) ;//1?a?true???NaN?[object Object]??
    

    相关文章

      网友评论

          本文标题:JavaScript笔记-4

          本文链接:https://www.haomeiwen.com/subject/gpagvqtx.html