1.作用域定义:
作用域是程序中定义变量的可访问范围。它决定了在代码中的哪些位置可以访问或引用一个变量。
2.作用域分类:
常见的作用域类型包括全局作用域、局部作用域、函数作用域和块级作用域。
(1)全局作用域:
在整个程序中都可以访问的作用域。在程序开始执行时创建,在程序结束后销毁。
(2)局部作用域:
限定在特定代码块内的作用域,例如函数内部或循环体内部。在进入代码块时创建,在离开时销毁。
(3)函数作用域:
在函数内部声明的变量只能在该函数内部访问。函数作用域也可以嵌套,内部函数可以访问外部函数的变量。
(4)块级作用域:
在一对花括号 {} 内部声明的变量有块级作用域,只能在这个块内部访问。常见的块级作用域是由 if、for、while 等语句构成的代码块。
知识点补充:
全局对象:
在浏览器环境中,全局作用域中声明的变量会成为全局对象的属性。在浏览器中,全局对象是 window 对象;在 Node.js 环境中,全局对象是 global 对象。可以通过全局对象来访问全局作用域中的变量。
作用域链:
当访问一个变量时,JavaScript 引擎会先在当前作用域中查找,如果找不到,就会沿着作用域链向上一级作用域查找,直到找到该变量或到达全局作用域。这样的作用域链决定了变量的可访问性。
闭包:
闭包是指一个函数可以访问并操作其外部函数中的变量,即使外部函数已经执行完毕。这是因为在创建闭包时,内部函数会保留对外部函数作用域的引用。闭包可以用于创建私有变量和实现函数柯里化等功能。
函数柯里化:
将接受多个参数的函数转化为接受一个参数的函数,并返回一个新的函数,该新函数接受剩余参数并返回最终结果。
举个例子来说明柯里化的概念。假设有一个接受两个参数的函数add,可以通过柯里化将其转化为接受一个参数的函数addCurry:
def add(x, y):
return x + y
def addCurry(x):
def inner(y):
return x + y
return inner
可以使用addCurry函数来创建一个新的函数,该函数接受一个参数并返回一个新的函数,该新函数接受剩余参数并返回最终结果:
add5 = addCurry(5)
result = add5(3) # 返回8
3.作用域优点:
作用域的概念有助于避免命名冲突和提高代码的可读性和维护性。了解作用域的工作原理对于理解变量的生命周期和程序的执行流程非常重要。