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

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. 20140319 const sizeof define 编译时分配内存

    1.面试宝典预处理,const,sizeof Define作用定义函数: //用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 ...

  2. 活动:月末送Java技术书福利|抽奖

    本公众号运营了快一年了 原创干货超过200+ 收获了也快1W粉丝 这么多粉丝-- 送书活动怎能少? 虽然这次我们是有备而来 但是-- 所有书籍为作者自掏腰包 所以本次送书数量有限 不能满足到所有人 重 ...

  3. 【python】collections的使用

    老师布置了一个课后作业. 统计文本中字母出现的次数并找到最大的那一个 首先是读取文本吧.和c里的也差不多,打开,关闭,读取. path = f = f.close() 然后就用到了这个黑科技.coll ...

  4. arm-linux-readelf 的使用

    1. 读 elf 文件开始的文件头部 [arm@localhost gcc]$ arm­linux­readelf ­h hello ELF Header: Magic:   7f 45 4c 46 ...

  5. 8_InlineHook

    1 shellcode低2Gb警告.应使用高2GB 稳定 : 在内核挂钩子: 由于每个进程的低2gb 的数据是不同的:所以 在内核挂钩子 因该把 代码 放在 高 2gb. 方法1(申请): 比如 使用 ...

  6. MongoDB使用固定集合

    MongoDB中的固定集合:大小是固定的,类似于循环队列,如果没有空间了,最老的文档会被删除以释放空间,新插入的会占据这块空间. 1.固定集合(oplog) oplog是一个典型的固定集合,因为其大小 ...

  7. python的update方法

    b = {"c":0, "position":{}} b["position"]["IF"] = {} print(b) ...

  8. Java Collection - ArrayList & LinkedList

    总结 ref: https://blog.csdn.net/qq_32679815/article/details/78907437 1-ArrayList是实现了基于动态数组的数据结构,Linked ...

  9. Vim: 强大的g

    来源于:http://vim.wikia.com/wiki/Power_of_g 一般格式: :[range]g/pattern/cmd 对range内所有符合pattern的行执行cmd 常见的一些 ...

  10. 解析Mybatis入门第三天

    目的:使用mybatis对数据的一些标签的使用和表与表之间的一对多和多对一的查询方式. 例如:if.where.foreach 前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的 ...