给定JavaScript代码示例中,会隐式创建全局变量x吗?
关于这段代码中变量x是否为全局变量的解答
嘿,咱们来好好拆解这段代码里的变量x到底会不会变成全局变量哈!
首先先把你给的代码整理成更易读的格式,方便分析:
function f(){ var ar=[],i; for(i=0;i<3;i++){ //this time instead of passing i, the function has a local value called x ar[i]=(function(x){ return function(){ return x; }; })(i); } return ar; }
(注:代码里有个小笔误,arr应该是ar,不过不影响咱们分析变量x的作用域)
接下来直接给结论:变量x绝对不会成为全局变量,也不会触发你担心的“逐级查找未找到后隐式创建全局变量”的行为,原因如下:
- 这里的
x是**立即执行函数(IIFE)**的参数,当我们把循环变量i作为实参传递给这个IIFE时,x就成为了该IIFE的局部变量,它的作用域仅限于这个IIFE内部,以及它返回的闭包函数中。 - 你提到的“隐式创建全局变量”的场景,只有当你在函数内部直接给一个未声明的变量赋值时才会发生(比如
function g() { x = 10; },这种情况下x会被挂载到全局作用域),但这段代码里的x是作为函数参数存在的,相当于在IIFE内部已经隐式完成了变量声明,完全不会往全局作用域去查找或者创建。 - 就算退出这个局部的IIFE之后,返回的闭包函数虽然还会保留对
x的引用,但x始终是IIFE的局部变量,和全局作用域没有任何关联。
内容的提问来源于stack exchange,提问作者akotch
相关产品推荐
相关产品推荐

