本书属于基础类书籍,会有比较多的基础知识,因此这里仅记录日常不怎么容易注意到的知识点,不会全记,供你们和本身翻阅;前端
上中下三本的读书笔记:segmentfault
全局变量会自动成为全局对象(浏览器中是 window
) 的属性,所以是不能够直接经过全局对象的此法名称,而是间接地经过全局对象属性的应用来对其进行访问 window.a
,经过这种方法能够访问那些被同名变量所遮蔽的全局变量。可是若是非全局的变量若是被遮蔽了,不管如何都没法被访问到。浏览器
若是词法做用域彻底由写代码期间函数所生命的位置来定义,那么能够经过几种方法来欺骗(修改)词法做用域,好比 eval
、with
可是要注意:欺骗词法做用域会致使性能降低。性能优化
由于JS引擎会在编译阶段进行性能优化,其中有些优化依赖于可以根据代码的词法进行静态分析,并预先肯定全部变量和函数的定义位置,才能在执行过程当中快速找到标识符。可是若是引擎在代码中找到 eval
、with
,就会彻底不作任何优化。微信
包装函数的声明以 function
关键字开始,那么就是函数声明,而下面这个例子是以 (function
开始,那么就是函数表达式:闭包
const a = 1; function foo() { // 函数声明 const a = 4; console.log(a); } (function foo() { // 函数表达式 const a = 3; console.log(a); }()) console.log(a);
因此上面的 IIFE
将会被当作函数表达式而不是一个函数声明来处理;app
函数声明和函数表达式之间最重要的区别是他们的名称标识符会绑定在何处。函数
函数声明的名称标识符 foo
会被绑定在所在做用域中,能够直接经过 foo()
来调用;而函数表达式的 foo
被绑定在函数表达式只剩的函数中而不是所在做用域中;性能
同时,即便是具名的函数表达式,名称标识符在赋值以前也没法在所在做用域中使用。优化
try/catch
结构的 catch
分句中具备块级做用域。
函数声明会被提高,而函数表达式不会被提高。
函数声明和变量声明都会被提高,可是函数会首先被提高,而后才是变量。
foo() // 1 var foo function foo() { console.log(1) } foo = function() { console.log(2) }
函数声明 foo
会首先被提高,而后打印出 1
,后面的 var
声明会被认为是重复声明而被忽略;可是注意若是后面出现同名函数声明,则会覆盖前面的:
foo() // 2 function foo() { console.log(1) } function foo() { console.log(2) }
this
其实是在函数被调用时发生的绑定,它指向什么彻底取决于函数在哪里被调用,并非在编写时绑定。当一个函数被调用时,会建立一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this
就是这个记录的一个属性,会在函数执行的过程当中用到。
咱们能够根据优先级来判断 this
:
new
中调用,若是是的话, this
绑定的是新建立的对象;var bar = new foo()
call
、apply
或者硬绑定调用,若是是的话,this
绑定的是指定的对象;var bar = foo.call(obj)
this
绑定的是那个上下文对象;var bar = obj.foo()
undefined
,非严格模式绑定到全局对象;var bar = foo()
null
、undefined
做为 this
的绑定对象传入 call
、apply
、bind
,那么这些值在调用时会被忽略,实际应用的是默认绑定;this
,且箭头函数的绑定没法被修改,new
也不能够;PS:欢迎你们关注个人公众号【前端下午茶】,一块儿加油吧~
另外能够加入「前端下午茶交流群」微信群,长按识别下面二维码便可加我好友,备注加群,我拉你入群~