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;所以就是上面的输出答案。
     

  • 相关阅读:
    蓝桥网试题 java 基础练习 特殊的数字
    蓝桥网试题 java 基础练习 杨辉三角形
    蓝桥网试题 java 基础练习 查找整数
    蓝桥网试题 java 基础练习 数列特征
    蓝桥网试题 java 基础练习 字母图形
    蓝桥网试题 java 基础练习 01字串
    蓝桥网试题 java 基础练习 回文数
    蓝桥网试题 java 基础练习 特殊回文数
    Using text search in Web page with Sikuli
    each of which 用法
  • 原文地址:https://www.cnblogs.com/mamimi/p/6814355.html
Copyright © 2011-2022 走看看