一:作用域的问题

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

js易犯错误与易混淆的重要知识点的更多相关文章

  1. [golang 易犯错误] golang 局部变量初始化:=的陷阱

    我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便.但是,这也是易犯错误的地方之一.特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋 ...

  2. java代码书写易犯错误

    java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...

  3. 编程中易犯错误汇总:一个综合案例.md

    # 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...

  4. 【C++】常见易犯错误之数值类型取值溢出与截断(3)

    0.  前言 本节是“[C++]常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出. 1. 相关知识 (1) 浮点型数据取值范围如下: 单精度型 float 3.4 * 1 ...

  5. 【C++】常见易犯错误之数值类型取值溢出与截断(1)

    1. 数据类型数值范围溢出 如标题所述,该错误出现的原因是由于变量的值超出该数据类型取值范围而导致的错误. 例题如下: (IDE环境:C-Free,编译器为mingw5,如下图) # include ...

  6. Java开发者易犯错误Top10

    本文总结了Java开发者经常会犯的前十种错误列表. Top1. 数组转换为数组列表 将数组转换为数组列表,开发者经常会这样做: List<String> list = Arrays.asL ...

  7. 啥也不是 -「OI 易犯错误整理」

    原帖出自 Nefelibata,不过他不想维护,所以就交给 STrAduts 了 awa.因为一些不可抗力,帖主转移至 XSC062.申请置顶! 前言 Nefelibata:因为笔者弱到无法形容,因此 ...

  8. Python初学的易犯错误

    当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...

  9. OpenERP新手易犯错误之res.model

    接触OpenERP的人都感慨资料之少,尤其是XML中,出点错是相当郁闷的.尤其是新手.什么都别说了,有图有真相. 视图中关联模型name="model" ,而动作中name=&qu ...

随机推荐

  1. samtools+bcftools 进行SNP calling

    两个软件的作用:1.samtools mpileup 主要是用于收集BAM文件中的信息,这个位点上有多少条read匹配,匹配read的碱基是什么,并将这些信息存储在BCF文件中.2.bcftools ...

  2. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...

  3. INSPIRED启示录 读书笔记 - 第35章 情感接纳曲线

    技术接纳曲线 涉及了技术创新者.尝鲜者.早期消费大众.后期消费大众和跟随者,很少有产品能越过鸿沟——获得尝鲜者以外消费者的青睐 不同类型的用户具有不同的情感需求,除了技术接纳曲线模型描述用户外,还应该 ...

  4. 【codevs3031】最富有的人(字典树)

    网址:http://codevs.cn/problem/3031/ 这是蒟蒻写的第一道字典树……听说出市选题的神犇要出字符串,于是就赶紧滚去学了学(然而高精度算字符串算法?) 简单来说,字典树就是把一 ...

  5. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  6. java的一些基本格式

    书写方法的格式: 修饰符     返回值            方法名                  方法体 public     int/void    addNumber(参数)      { ...

  7. 【转】Vue.js:轻量高效的前端组件化方案

    摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...

  8. 解决Pycharm中matplotlib画图出错问题(AttributeError: module 'matplotlib' has no attribute 'verbose')

    最近在Linux中使用pycharm过程中使用matplotlib无法画图,总是提示错误 /usr/bin/python3. /home/leo/PycharmProjects/untitled1/E ...

  9. 关于linux的/var/www/html

    linux目录下有个目录:/var/www/html,把文件放到这个目录下就可以通过IP很方便的访问, 如果要访问 /var/www/html/myfolder/test.html 我在浏览器地址栏输 ...

  10. Codeforces Beta Round #61 (Div. 2) D. Petya and His Friends 想法

    D. Petya and His Friends time limit per test 2 seconds memory limit per test 256 megabytes input sta ...