你不知道的JS读书笔记

eval(...) 和 with:

js中有两个机制可以 " 欺骗 " ,词法作用域,eval 和 with。

前者可以对一段包含一个或多个声明的 " 代码 " 字符串进行演算,并借此来修改已经存在的词法作用域 ( 在运行时 )

后者本质上是通过将一个对象的引用当作 作用域 来处理,将对象的属性当作作用域中的标识符处理,从而创建了一个新的词法作用域 (同样是在运行时)

函数作用域的含义:属于这个函数的全局变量都可以在整个函数的范围内使用以及复用。

函数声明和函数表达式之间最重要的区别:是它们的名称标识符将会绑定到何处。

匿名函数的缺点:

①匿名函数在栈追踪中不会显示出有意义的函数名,使得调试很困难。

②没有函数名,当函数需要引用自身时只能使用已经过期的 arguments.callee 引用。(举例:递归中,事件触发后事件监听器需要解绑自身)

③匿名函数省略了对于代码 可读性 / 可理解性 很重要的函数名。(一个描述性的名称可以让代码的功能不言而喻)

IIFE:立即执行函数表达式,Immediately Invoked Function Exprssion ;(举例:( function foo (){...} )() 。第一个()将函数变为表达式,第二个执行了这个函数,另一种写法( function foo (){...} ()) 。二者功能一致)

块级作用域是一个用来对之前的最小授权原则进行扩展的工具,将代码从在函数中隐藏信息扩展为在块中隐藏信息。

变量的声明应该距离使用的地方越近越好,并最大限度地本地化。

let:let关键字可以将变量绑定到所在的任意作用域中(通常是{...}内部)。换句话说,let为其声明的变量隐式地劫持了所在的块作用域。(只要声明是有效的,在声明中任意位置都可以使用 {...} 括号来为let创建一个用于绑定的块,{} 即显示的。)

从ES3开始,try / catch 结构在 catch 分句中具有块级作用域。

闭包是基于词法作用域书写代码时所产生的的自然结果。

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

在定时器,事件监听器,Ajax请求,跨窗口通信,Web Workers 或者 任何其他的异步(或同步)任务中,只要使用了回调函数,实际上就是在使用闭包!

当函数可以记住并访问所在的词法作用域,即使函数时在当前词法作用域之外执行,这时就产生了闭包。(作用域就是词法作用域,词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则。词法作用域最重要的特征是它的定义过程发生在代码的书写阶段。

模块有两个主要特性:①为创建内部作用域而调用了一个包装函数;②包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包。

作用域链是基于调用栈的,而不是代码中的作用域嵌套。(动态作用域不关系函数和作用域是如何声明以及何处声明的,只关心它们从何处调用。this机制息息相关,二者是表亲。)

箭头函数在设计 this 绑定时的行为和普通函数的行为完全不一致。它放弃了所有普通 this 绑定的规则,取而代之的是用当前的词法作用域覆盖了 this 本来的值。

原文地址:https://www.cnblogs.com/goforxiaobo/p/14317224.html