关于JS函数的作用域?

function foo(){ 
  console.log(a); 
}
function bar () { 
  var a = 3; 
  foo(); 
} 
var a = 2; 
bar(); 

上述代码,为什么结果是2呢,不应该是在bar()函数里面调用的foo()函数,所以应该先在bar()的作用域里面找有没有a,然后再去全局作用域里找吗?
希望走过、路过的大神能帮忙解决一下疑惑,万分感谢。

阅读 1.7k
3 个回答

这里的作用域规则是定义时的作用域规则,不是你调用时的,即静态作用域

如果你这样写:

function bar () { 
  var a = 3; 
  function foo(){ 
    console.log(a); 
  }
  foo(); 
} 
var a = 2; 
bar(); 

那肯定输出 3 了

foo使用的是全局变量的a

你可以假设一下:如果让你设计编程语言时,如果一个函数被调用,如何确定他的作用域?
函数作用域无外乎两种:静态作用--按照书写代码时函数说在的位置确定作用域;动态作用域--函数被调用是动态确定。

JS和大多数编程语言一样,采取了静态作用域。

你可以以这两个关建词进行Google搜索,非常多的博客有讨论

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