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

本文探讨JavaScript中的两种主要作用域模式:词法作用域和函数作用域。词法作用域在编译阶段确定,作用域查找在找到第一个匹配标识符时停止。而函数作用域允许在整个函数范围内使用变量。eval和with是JavaScript中可以改变词法作用域的机制,但会降低代码性能,应避免使用。此外,文章还提到了函数声明与函数表达式的区别,以及IIFE(立即执行函数表达式)的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

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

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

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

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

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

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

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

IIF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值