词法作用域(Lexical scope)我们需要理解词法作用域的一些知识 。请看下面的例子:

文章插图
这里想说明,我们在函数执行上下文中有变量,在全局执行上下文中有变量 。JavaScript的一个复杂之处在于它如何查找变量,如果在函数执行上下文中找不到变量,它将在调用上下文中寻找它,如果在它的调用上下文中没有找到,就一直往上一级,直到它在全局执行上下文中查找为止 。(如果最后找不到,它就是 undefined) 。
下面列出向个步骤来解释一下(如果你已经熟悉了,请跳过):
- 在全局执行上下文中声明一个新的变量val1,并将其赋值为2 。
- 第2-5行,声明一个新的变量 multiplyThis,并给它分配一个函数定义 。
- 第6行,声明一个在全局执行上下文 multiplied 新变量 。
- 从全局执行上下文内存中查找变量multiplyThis,并将其作为函数执行,传递数字 6 作为参数 。
- 新函数调用(创建新执行上下文),创建一个新的 multiplyThis 函数执行上下文 。
- 在 multiplyThis 执行上下文中,声明一个变量n并将其赋值为6 。
- 第 3 行 。在multiplyThis执行上下文中,声明一个变量ret 。
- 继续第 3 行 。对两个操作数 n 和 val1 进行乘法运算.在multiplyThis执行上下文中查找变量 n 。我们在步骤6中声明了它,它的内容是数字6 。在multiplyThis执行上下文中查找变量val1 。multiplyThis执行上下文没有一个标记为 val1 的变量 。我们向调用上下文查找,调用上下文是全局执行上下文,在全局执行上下文中寻找 val1 。哦,是的、在那儿,它在步骤1中定义,数值是2 。
- 继续第 3 行 。将两个操作数相乘并将其赋值给ret变量,6 * 2 = 12,ret 现在值为 12 。
- 返回ret变量,销毁multiplyThis执行上下文及其变量 ret 和 n。变量 val1 没有被销毁,因为它是全局执行上下文的一部分 。
- 回到第6行 。在调用上下文中,数字 12 赋值给 multiplied 的变量 。
- 最后在第7行,我们在控制台中打印 multiplied 变量的值
返回函数的函数在第一个例子中,函数addTwo返回一个数字 。请记住,函数可以返回任何东西 。让我们看一个返回函数的函数示例,因为这对于理解闭包非常重要 。看粟子:

文章插图
让我们回到分步分解:
- 第1行 。我们在全局执行上下文中声明一个变量val并赋值为 7 。
- 第 2-8 行 。我们在全局执行上下文中声明了一个名为 createAdder 的变量,并为其分配了一个函数定义 。第3-7行描述了上述函数定义,和以前一样,在这一点上,我们没有直接讨论这个函数 。我们只是将函数定义存储到那个变量(createAdder)中 。
- 第9行 。我们在全局执行上下文中声明了一个名为 adder 的新变量,暂时,值为 undefined 。
- 第9行 。我们看到括号(),我们需要执行或调用一个函数,查找全局执行上下文的内存并查找名为createAdder 的变量,它是在步骤2中创建的 。好吧,我们调用它 。
- 调用函数时,执行到第2行 。创建一个新的createAdder执行上下文 。我们可以在createAdder的执行上下文中创建自有变量 。js 引擎将createAdder的上下文添加到调用堆栈 。这个函数没有参数,让我们直接跳到它的主体部分.
推荐阅读
- 教您win10电脑锁屏怎么设置
- 电脑为什么打不开指定的网站?什么是DNS解析我要如何设置DNS
- 此刻我独领风骚哪首歌里面的
- 花生芝麻豆渣饼的做法
- 我想种植黄茶在哪里购买黄茶苗,中国黄茶之乡在哪里
- 我的成长故事 我的故事作文600字
- 养老金怎么查?教你三步搞定!
- 康山黄茶收货时怎么辨别真伪,我在网上买了康山黄茶收货时怎么辨别真伪
- 小夫与胖虎6张图 小夫我要进来了是什么梗
- redis的多路复用是什么鬼
