javascript中的嵌套函数作用域链

时间:2016-12-15 08:46:01

标签: javascript

我在" JavaScript The Definite Guide"而且每次调用函数时我都无法理解为什么内部函数的范围链会有所不同

"在顶级JavaScript代码中(即,任何函数定义中未包含的代码), 范围链由单个对象组成,即全局对象 在非嵌套函数中, 范围链由两个对象组成 第一个是定义函数的对象 参数和局部变量,第二个是全局对象 在嵌套函数中, 范围链有三个或更多对象。

了解这个链是多么重要 对象的创建 定义函数时,它会存储范围链然后生效 调用该函数时,它会创建一个新对象来存储其局部变量,和 将新对象添加到存储的作用域链中以创建一个新的,更长的链 表示该函数调用的范围。

这变得更有趣了 嵌套函数因为每次调用外部函数时,内部函数都是 再次定义。
由于范围链在每次调用外部函数时都不同, 每次定义内部函数时,内部函数将略有不同 - 内部函数的代码 函数在外部函数的每次调用时都是相同的,但是范围链 与该代码相关联的内容将有所不同。"

1 个答案:

答案 0 :(得分:1)

每次调用函数时,都会为该函数的调用创建一个新的作用域。

该函数中定义的任何变量(带var,函数声明或命名参数)都限定为该函数。

function foo (bar) { };
foo(1);
foo(2);

在上面,创建了两个范围。其中一个bar 1在另一个bar中为function foo (bar) { return function () { console.log(bar); } }; var foo1 = foo(1); var foo2 = foo(2);

如果在另一个函数中定义了一个函数,那么它就可以访问它在其中创建的作用域。

foo1

分配给bar的功能可以访问1foo2的范围。

分配给bar的功能可以访问2CASE WHEN (coalesce(length(items.item_code),0) + length(items.item_code)) < 1 THEN items.name::text ELSE items.item_code::text END as item_code 的范围。