在JavaScript中声明全局变量f与局部变量f是否存在差异?
为什么将函数f声明在内部或外部结果一致?
这问题问得挺到位的!咱们来拆解一下背后的原因,其实核心在于闭包的特性以及你当前的调用方式~
首先先把两种写法摆出来对比:
写法1:f为局部变量
function functionFunction(str) { var f; return f = function(obj){ return str + ', ' + obj; } } functionFunction('Hello')('world') // 输出 "Hello, world"
写法2:f为全局变量
var f; function functionFunction(str) { return f = function(obj){ return str + ', ' + obj; } } functionFunction('Hello')('world') // 同样输出 "Hello, world"
核心原因:返回的是函数本身,f只是“容器”
不管f是局部还是全局变量,你最终调用的是functionFunction('Hello')返回的匿名函数,而不是变量f。f在这里只是一个用来临时存储这个匿名函数的载体而已,真正起作用的是那个被返回的函数,以及它形成的闭包。
闭包的作用
这个匿名函数会捕获外部函数functionFunction中的str变量(也就是你传入的'Hello'),哪怕functionFunction执行完毕退出了作用域,这个匿名函数依然能访问到str的值。所以不管这个函数是存在局部变量f里还是全局变量f里,它的闭包特性都没变,调用时自然能正确拼接字符串。
什么时候会出现差异?
如果你后续复用变量f,两种写法的差异就会显现出来:
- 全局f的情况:每次调用
functionFunction都会覆盖全局的f,后续直接调用f会使用最后一次赋值的函数:functionFunction('Hello')('world') // "Hello, world" functionFunction('Hi')('there') // "Hi, there" f('test') // 输出 "Hi, test"(全局f已被更新) - 局部f的情况:f只存在于
functionFunction的内部作用域,外部根本访问不到,更不会被后续调用影响:functionFunction('Hello')('world') // "Hello, world" functionFunction('Hi')('there') // "Hi, there" typeof f // 输出 "undefined"(外部无此变量)
总结
你当前的调用是一次性的,只用到了functionFunction返回的函数,没有涉及后续对f的操作,所以两种写法的结果完全一致。作用域的差异只有在你尝试访问或复用f变量时才会体现出来~
内容的提问来源于stack exchange,提问作者Xinyi Li
相关产品推荐
相关产品推荐

