javascript 基础(作用域和闭包)

186 阅读2分钟

JavaScript简介

  1. 弱类型,大小写敏感的脚本语言
  2. 作用:
    • 网页行为操作;
    • 验证表单;
    • 浏览器信息;
    • 创建cookies;
  3. 组成:
    • 逻辑处理的ECMAscirpt
    • DOM 操作
    • BOM 操作

需要注意的语法:

  1. 变量和数据类型:
    • 存储直接量,直接存值;(直接量或者叫基本数据类型包括数字number,字符串string,布尔值Boolean)。
    • 存储对象,存地址或者叫引用;(对象包括数组Array,函数function,自定义对象)
  2. 数据类型转换:
    • 查看typeof()
    • 变成number:Number(a)
    • 变成string:String(a)a.toString()
    • 强制数据类型转换
  3. 流程控制语句if/switch/for/while
    • 需要注意break和continue的区别:
      • break 跳出循环到继续执行循环后面的语句;
      • continue 跳出循环到循环开始的地方,继续执行循环;

函数和作用域,预解析

  1. 设定初始值防止报错的常用语句:var a = a||1; //假如未传入形参a,则a默认为1
  2. 当传入参数个数不定时,需要使用动态参数:
    function add(){
        for (i=0; i<=arguments.length; i++){ //使用函数自带的参数数组:arguments
            sum+=arguments[i];
        }
        return sum;
    }
    
  3. 作用域: js没有块作用域,只有用函数划分作用域:
    • 函数外面声明的变量为全局作用域:生命周期为页面存在的时间;
    • 函数里面用var声明的变量为局部作用域:生命周期为函数执行的过程中;
    • 函数里面未用var声明的变量会被提升为全局变量: 生命周期为页面存在的时间;
    • 作用域链:函数内使用的未声明的变量,会一层一层的向上查找直到global;
  4. 预解析
    • 浏览器拿到js文件是会先进行预处理:将变量声明(包括函数声明)语句(注意不包括赋值语句)提到最前面;
    • 函数内部的局部变量声明(使用var 声明)会提到函数体的最前面;
    • 函数内部的全局变量声明(未使用var)会在函数执行的时候提到js文档的前面;

闭包

  1. 简介及产生:
    • 目的是为了解决变量私有化的问题:全局变量易被污染局部变量生命周期短 的冲突;
    • 闭包可以使函数内部变量既拥有全局变量的生命周期又不能被外部访问。
    • 典型的闭包及解析:
    function add(){
        var counter = 0;       //var声明注定counter是一个局部变量
        plus = function(){    //plus未用var声明,所以暴露给外面使用;但需要add先执行来初始化;
            counter++;         //未使用var 声明,使counter具有了全局变量的声明周期
            console.log(counter);
        }
    }
    add(); //执行add,初始化counter 和 plus()
    plus(); //1
    plus(); //2
    console.log(counter); //报错,因为是局部变量
    
    • 用匿名函数和立即执行函数简化之后的闭包(更常用):
    var plus = (function(){
        var counter = 0;
        return function(){
            counter++;
            console.log(counter);
        }
    })();
    plus(); //1
    plus(); //2
    console.log(counter); //报错