请问为什么输出的结果是0,而不是20呢

var x = 0;
function foo() {
alert(x);
}
function bar() {
var x = 20;
foo();
}
bar();

阅读 4.2k
7 个回答

clipboard.png

JS 作用域链如图,bar 中调用 foo,foo 作用域中未定义 x,沿作用域链查找到 window.x。若想打印 20,在 bar 中定义 foo 即可。

20是局部变量,0是全局的,

关键字:函数的作用域链~

js是静态作用域,函数调用时的变量查找时从定义的位置开始查找,也就是先从foo函数内部查找,没有找到x,在向上查找,foo是定义在全局作用域中,因此向上查找找到了全局的x

alert(x) 首先查找当前作用域是否存在,不存在继续往上查找就到window了,window.x = 0,因为var声明在window上。

1、20是方法bar中的局部变量,在方法内。
2、0是全局变量,bar方法和foo方法都可以访问到,而foo方法访问不到bar中的局部变量,所以执行bar方法的时候调用全局变量0.多看看定义域吧

新手上路,请多包涵

这个是作用域的问题。在第二个函数里调用第一个函数foo,foo执行时首先会在自己的作用域里查找变量x,由于foo函数定义的时候作用域里没有声明变量x,于是会自动向自己的父级作用域查找变量x,同时因为函数foo是一个全局函数,其父级作用域就是window了,这时候刚好就找到了window作用域下的变量x=0,所以这个输出结果会是0。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题