函数声明和变量声明都会被提升,但函数声明会被提升到普通变量前,而

var foo = function bar(){};

赋值操作不会被提升。

闭包:

基于词法作用域(作用域是根据名称查找变量的一套规则)书写代码时所产生的必然结果。

ReferenceError同作用域判别失败相关。

TypeError代表作用域判别成功,但结果的操作是不合法的。

不成功的RHS引用会抛出ReferenceError。

不成功的LHR引用会导致自动隐式创建一个全局变量。

展示闭包效果的代码:

function foo(){
var a =2;
function bar(){
console.log(a);
}
return bar;
}
var baz = foo();//

闭包使函数可以继续访问定义时的词法作用域。

无论通过何种手段将内部函数传递到所在词法作用域之外,它都会持有对于原始作用域的引用,无论在何处执行这个函数,都会使用闭包。

将函数作为值并到处传递,就可以看到闭包的应用。定时器,事件监听器,ajax,跨窗口通信,web workers或其他的异步(或同步)任务中,只要使用了回调函数,实际上就是使用闭包。

如果不执行外部函数,内部作用域和闭包都无法被创建。

模块模式的条件:

1、必须有外部的封装函数,该函数至少被调用一次。

2、封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域形成闭包,并且可以访问或修改私有的状态。

词法作用域是在定义时确定的,动态作用域是在运行时确定的(判断this)。

this:

foo.call(foo,i);//使用call(...)可确保this指向函数对象foo本身

this在任何情况下都不止像函数的词法作用域。

this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。

非严格模式下的默认绑定才能绑定到全局对象。

当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。

显示绑定this的方法:apply(...)、call(...)

工作原理:第一个参数是对象,把这个对象绑定到this,调用函数时指定这个this。

硬绑定:bind()

使用new来调用函数或者说发生构造函数调用时会执行:(new绑定)

1、创建(或构造)一个全新对象;

2、这个对象会被执行原型链接;

3、这个对象会被绑定到函数调用的this;

4、如果函数没有其他对象,那么new表达式中的函数调用会自动返回这个心对象;

判断this的基本方法:

1、new绑定:this指向心创建对象。

2、call()/apply()绑定或硬绑定,指向绑定对象。

3、上下文调用(隐式绑定)this指向上下文对象。

4、以上皆不是,使用默认绑定,严格模式下是undefined,非严格模式为全局对象。

箭头函数不使用this的四种标准规则,而是根据外层(全局或函数)作用域来决定this,箭头函数的绑定无法被修改,它可以像bind()一样确保函数的this被绑定到指定对象上,和(self = this)机制一样。

(尽量避免使用self=this和箭头函数,改用bind(...))

polyfill指挂墙的腻子,polyfill代码主要用于就浏览器的兼容。

js中创建空对象最简单的方法:

Object.creat(null)

与{}很像但不会创建Object.prototype委托。完全不会受到原型链干扰,非常适合存储数据。

null会被判断为对象的原因:不同对象在底层表现为二进制,js中二进制前三位为0会被判断为对象,null二进制全是0,所以执行typeof会返回“object”

《你不知道的javascript》上卷笔记整理(一)的更多相关文章

  1. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

  2. 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现

    console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...

  3. 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制

    [[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...

  4. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

  5. 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法

    function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...

  6. 【你不知道的javaScript 上卷 笔记4】javaScript 中闭包的一些运用

    什么是闭包 闭包是javaScript语言的一种特性,在 javaScript 中以函数作为承接单元.当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行. fun ...

  7. 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则

    一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...

  8. 【你不知道的javaScript 上卷 笔记1】 javaScript 是如何工作的?

    一.什么是作用域? 作用域是用来存储变量以及方便寻找变量的一套规则. 二.javaScript 编译过程(编译发生在代码执行前的几微妙) 分词/词法分析(Tokenizing/Lexing)-> ...

  9. 《你不知道的 JavaScript 上卷》 学习笔记

    第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...

  10. 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)

    原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...

随机推荐

  1. Slow HTTP POST慢速攻击

    测试工具 模拟测试工具:slowhttptest https://github.com/shekyan/slowhttptest 安装: https://github.com/shekyan/slow ...

  2. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  3. ArcGIS和ENVI最新软件下载

    浏览的时候发现一位博主分享了很多版本很新的软件 在这里分享一下下载界面链接 https://www.ixxin.cn/software.html

  4. startup_stm32f10x_xx.s 启动代码文件选择

    引用http://blog.csdn.net/gasbi/article/details/7545568 整体感觉stm32给的库文件太琐碎了,正如它的芯片型号一样繁多,例如启动文件: 网上查到的各个 ...

  5. Windows XP浏览器支持度

    XP最多支持到IE8 谷歌已经结束对Windows XP版Chrome浏览器的支持. 2015年11月,谷歌表示会在2015年结束后,结束对Windows XP版Chrome浏览器的支持.而今,随着2 ...

  6. 使用navicat 使用IP、用户名、密码直接连接linux服务器里面的数据库

    一般新申请的服务器,没有开通3306端口的吧,反正我遇到的,要用Navicat去连接linux下的数据库,都必须填写两个地方的信息,才能链接成功. 如果想要只通过填写ip还有数据库用户名还有密码就可以 ...

  7. CSS动画库——animate.css的使用

    Animate.css是一款强大的CSS3动画库 官网地址:https://daneden.github.io/animate.css/ 使用方法如下所示: (1)下载animate.css 下载地址 ...

  8. 数据库MySQL--条件查询/排序查询

    一.条件查询 条件查询:满足条件的字段被筛选出来 语法:select 查询列表字段 from 表名 where 筛选条件: 条件查询的条件分类: 1.按条件表达式筛选:条件运算符:>, < ...

  9. Delphi 第2课

    项目文件.dpr单元文件.pas--目标文件.dcu窗体文件.dfu begin 对象名.属性 对象名.方法end; 在delphi 自动提示控制语句结构 键盘输入Ctrl 就可以看到了 代码错误:( ...

  10. python 随便笔记

    1 判断字符串中是否有数字 i.isdigit()==True else False #判断是否是数字i.isalpha()==True else False #判断是否是字母 i.isspace() ...