• js易犯错误与易混淆的重要知识点


    一:作用域的问题

    简单案例1:

        var a = 1;
    var n = function () {
    console.log(a);
       var a=2;
    }

    n(); =》输出undefined
    原因:这是因为js中,在一个函数内引用变量时,会现在其当前函数内部作用域搜索,也被称为函数内部作用域。当其内部没有该变量时,则搜索其上层作用域,一直到全局作用域。该例子中 a 先搜索其内部,有a变量的声明,所以外部的a=1被屏蔽了,至于为什么a为undefined是因为变量声明会提前。而a被赋值
    的步骤在console.log()之后。
    案例2:
    var scope='top';
    var fnc1 = function () {
      console.log(scope);
    }
    fnc1(); =>top
    var fnc2 = function () {
      var scope= "bottom";
      fnc1();
    }
    fnc2(); =》输出top
    原因:这是因为js是一个静态的作用域。函数的作用域的嵌套关系是由定义时决定的,并不是由调用时决定的。也可以把js看成一种词法作用域,就是说 不用等到函数加载就已经确定了作用域的嵌套关系。可以直接分析其语法。

    二:闭包
    闭包的严格定义是:‘由函数(环境)及其封闭的自由变量组成的集合体 ’ 通俗的说,js中每个函数都是闭包。

    案例:
    var p = function () {
    var i = 0
    var get = function () {
    i++
    return i
    }
    return get
    }
    var k1 = p();
    var k2 = p();
    console.log(k1()); 输出1
    console.log(k1()); 输出2
    console.log(k2());输出1
    console.log(k2()); 输出2

    原因:
    1:先分析下闭包:var k1=p();该步输出的是函数get 也就是下面的函数:

    function () {
    i++
    return i
    }

    所以:需要再次执行k1,即k1();才能输出i
    2:闭包是一种互不干扰的函数封装 生成的实例也是互不干扰。首先实例k1/k2在其未被调用的时候(k1()/k2())内部的i变量值是0(类似上个案例,函数的作用域的嵌套),当执行一次k1/k2时,变量i就会加1;所以就是上面的输出答案。
     

  • 相关阅读:
    Mac下Mysql启动异常["ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"]
    Appium的前世今生
    appium自动化测试
    ubuntu下nvm,node以及npm的安装与使用
    Android反编译
    Android 常用 adb 命令总结
    Android SDK开发常用工具的使用及其异常处理
    如何获取android app的Activity
    Android 上多方式定位元素(python)
    获得android应用的版本号
  • 原文地址:https://www.cnblogs.com/mamimi/p/6814355.html
Copyright © 2020-2023  润新知