JavaScript强化版知识——词法作用域和函数作用域

作用域共有两种主要的工作模式。第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另一种叫做动态作用域

词法作用域:定义在词法阶段的作用域

作用域查找会在找到第一个匹配的标识符时停止

JavaScript中有两种机制来实现这个目的(在运行时修改‘欺骗’词法作用域)——欺骗词法作用域会导致性能下降

1. eval:JavaScript中的eval(....)函数可接受一个字符串为参数,并将其中的内容视为好像在书写时就存在程序中这个位置(可以在你写的代码中用程序生成代码并运行)

eval(...)都可以在运行期修改书写期的词法作用域

2. with:重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象本身

with可将一个没有或多个属性的对象处理为一个完全隔离的词法作用域

eval(...)函数如果接受了含有一个或多个声明的代码,就会修改其所处的词法作用域,而with声明实际上是根据你传递给它的对象凭空创建了一个全新的词法作用域

这两种机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎的认为这样的优化是无效的。使用这其中任何一个机制都将导致代码运行变慢。不要使用它们

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

区分函数声明和表达式最简单方法是看function关键字出现在声明中的位置(不仅仅是一行代码,而是整个声明中的位置)。如果function是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式

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

函数表达式可以是匿名的,而函数声明则不可以省略函数名——在JavaScript的语法中是非法的。

IIFE:代表立即执行函数表达式

最常见的用法:使用一个匿名函数表达式 OR 把它们当做函数调用并传递参数进去 OR 倒置代码的运行顺序

 

 

 

 

你可能感兴趣的:(JavaScript,eval,词法作用域,函数作用域,with,IIFE)