《你不知道的javascript》上卷笔记整理(一)
函数声明和变量声明都会被提升,但函数声明会被提升到普通变量前,而
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》上卷笔记整理(一)的更多相关文章
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现
console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...
- 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制
[[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...
- 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容
一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...
- 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...
- 【你不知道的javaScript 上卷 笔记4】javaScript 中闭包的一些运用
什么是闭包 闭包是javaScript语言的一种特性,在 javaScript 中以函数作为承接单元.当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行. fun ...
- 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则
一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...
- 【你不知道的javaScript 上卷 笔记1】 javaScript 是如何工作的?
一.什么是作用域? 作用域是用来存储变量以及方便寻找变量的一套规则. 二.javaScript 编译过程(编译发生在代码执行前的几微妙) 分词/词法分析(Tokenizing/Lexing)-> ...
- 《你不知道的 JavaScript 上卷》 学习笔记
第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...
- 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)
原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...
随机推荐
- 20130318 word2013 mathtype
1.word2013 下如何安装mathtype 1.word2013已经装好 2.下载mathtype6.9 3. 公式编辑器Mathtype安装后无法加载到word的解决办法http://w5 ...
- 【CF1215F】 Radio Stations
题目 比较精妙的\(\text{2-sat}\)建图了 还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选 前两种连边是板子就不解释了 考虑如何限制选择一个唯一的\(f\),并且还能限制不选 ...
- Activiti学习笔记8 — UserTask私有任务的使用
每一个UserTask都会在Execution表和Task表中各产生一条记录 一.创建流程引擎对象 /** * 1.创建流程引擎对象 */ private ProcessEngine processE ...
- 2019-6-23-WPF-解决弹出模态窗口关闭后,主窗口不在最前
title author date CreateTime categories WPF 解决弹出模态窗口关闭后,主窗口不在最前 lindexi 2019-06-23 11:48:38 +0800 20 ...
- Rsync 参数
# rsync -v, --verbose 详细模式输出 -q, --quiet 精简输出模式 -c, --checksum 打开校验开关,强制对文件传输进行校验 -a, --archive 归档模式 ...
- 502Bad Gateway
502 bad gateway,错误的网关的原因 连接超时,我们向服务器发送请求,由于服务器当前链接太多,导致服务器方面无法给予正常的响应,产生此报错,最好去服务器上找原因. 性能测试常见,可能是由于 ...
- 【noi.ac-CSP-S全国模拟赛第三场】#705. mmt
给定数组a[],b[] 求$$c_i=\sum_{j=1}^{i} a_{\left \lfloor \frac{n}{j} \right \rfloor}·b_{i \bmod j}$$ 大概就是对 ...
- drupal7 代码生成用户,并自动登录
直接上代码 1. 生成用户(注册) $edit = [ "name" => "name", "pass" => "pa ...
- Educational Codeforces Round 27 D. Driving Test
单调栈 题意看了半天... #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...
- P5390 [Cnoi2019]数学作业
P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...