zoukankan      html  css  js  c++  java
  • 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;所以就是上面的输出答案。
     

  • 相关阅读:
    Script to Create Benchmark Procs
    自定义数据类型修改
    需求管理工具试用 – CaliberRM
    标识值重复的原因示例
    Vmware vFabric Suite开始支持自动化部署与PostgreSQL
    在ubuntu上安装Oracle Java SDK
    详解数据中心基础设施的模块化建设
    Xcode 4 无证书真机调试 环境配置
    Calculate_and_Insert_Event_Intervals_in_SQL2005_Profiler
    浏览器工作原理
  • 原文地址:https://www.cnblogs.com/mamimi/p/6814355.html
Copyright © 2011-2022 走看看