作用域和作用域链

2019-06-27  本文已影响0人  独角仙没有角

"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()
上一篇 下一篇

猜你喜欢

热点阅读