作用域和作用域链

"JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。" ——《JavaScript权威指南》

var name = 'Schopenhauer'
// getName 封闭的作用域
function getName () {
  console.log(name)
}
// myName 封闭的作用域
function myName () {
  var name = 'wangxi'
  getName()
}

myName() // Schopenhauer

JavaScript 中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

执行 myName,函数内部执行了 getName,而 getName 是在全局环境下定义的,因此尽管在 myName 中定义了变量 name,对getName 的执行并无影响,getName 中打印的依然是全局作用域下的 name。

调用函数getName是在其先定义好的作用域中解析运行,因为在getName函数作用域中没有找到name变量,因此到外部全局作用域中搜索变量name,因此是Schopenhauer,而不是在myName去寻找的,严格意义上讲,所以有的函数都是闭包,具备独立的执行环境和作用域链,通过闭包实现,实现跨作用域访问变量(外部访问内部)
思考题目

var name = 'Schopenhauer'

function getName () {
  var name = 'Aristotle'
   var intro = function() {  // 这是一个闭包
      console.log('I am ' + name)
   }
   return intro
}

function showMyName () {
   var name = 'wangxi'
   var myName = getName()
   myName()
}

showMyName()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容