JavaScript 函数的高级特性:闭包与函数属性方法
1. 立即调用函数表达式(IIFE)
在 JavaScript 中,有一种常见的技巧是将函数的定义和调用写在一个表达式中,如下所示:
(function() {
// 代码块写在这里
}());
这种技术被称为“立即调用函数表达式”(Immediately Invoked Function Expression,IIFE)。代码中函数前面的括号是必需的,因为没有它,JavaScript 解释器会尝试将 function
关键字解析为函数声明语句。加上括号后,解释器能正确识别这是一个函数定义表达式,同时也有助于人类读者识别这是一个立即调用的函数,而非为后续使用而定义的函数。
当我们在命名空间函数内部使用该命名空间内的变量定义一个或多个函数,并将它们作为命名空间函数的返回值返回时,函数作为命名空间的这种用法就变得非常有用。这样的函数被称为闭包,接下来我们将详细介绍闭包。
2. 闭包
JavaScript 和大多数现代编程语言一样,使用词法作用域。这意味着函数在执行时使用的是其定义时的变量作用域,而不是调用时的变量作用域。为了实现词法作用域,JavaScript 函数对象的内部状态不仅要包含函数的代码,还要包含对函数定义所在作用域的引用。在计算机科学文献中,函数对象和函数变量解析所在的作用域(一组变量绑定)的这种组合被称为闭包。
从技术上讲,所有 JavaScript 函数都是闭包,但由于大多数函数是从其定义的相同作用域中