本文深入解析JavaScript中嵌套函数与在函数内调用外部函数的本质区别。通过代码示例证明,嵌套函数可访问外层局部变量,而外部定义的函数无法访问调用者的局部变量。核心原因在于函数定义时绑定的作用域链不同,旨在帮助开发者理解作用域规则,避免变量访问错误。
嵌套函数的作用域访问机制
在JavaScript中,函数内部定义的局部变量不仅在该函数体内有效,在其内部嵌套定义的函数中也始终可见。此外,函数的作用域链中总包含一个指向全局对象的引用,这使得函数能够访问全局变量。
var ga = 'global';
var func = function() {
var la = 'local';
return function() {
return function()
{
return function()
{
alert(la);alert(ga);
}
}
}
}
a = func();
a()()();// 弹出 local 和 global
外部函数调用与局部变量访问限制
那么,如果在外部定义一个函数A,并在另一个函数B的体内调用A,函数A能否访问函数B中定义的局部变量?答案是否定的。为了说明这一点,我们对前述示例进行如下修改:
var ga = 'global';
function repeat() {
alert(la);
}
var func = function() {
var la = 'local';
alert(1);
repeat();
alert(2);
};
func();
上述代码的运行结果仅弹出数字1。当执行repeat函数时,由于它试图访问一个未定义的变量,JavaScript解释器会抛出错误并中断程序执行。
造成这一现象的原因是,函数在定义时会保存其作用域链。函数repeat是在全局作用域中定义的,因此它的作用域链中并不包含名为la的局部变量。当它在全局作用域中查找la失败后,便会报错。
由此可见,嵌套函数与在函数内部调用外部函数之间存在显著差异。
本文源于昨日解答https://www.jb51.net/article/78958.htm时引发的思考。尽管概念上已知晓,但当时对为何在函数内部调用的repeat无法访问调用它的函数的局部变量感到困惑。今日查阅参考资料并亲自编写代码测试后,整理此文,希望能帮助有同样疑惑的开发者。