"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()
网友评论