javascript 作用域的疑惑
题目描述
//这段代码让人困惑,为什么method1可以访问到name呢?太奇怪了?
//如果name申明到了全局,那么全局的console.log(name)应该可以取到啊,如果没有申明到全局,那么method1()里面应该取不到啊。
相关代码
let height = '175'
function Person(){
console.log('Person调用了');
let name = 'ABao';
method1 = function(){
console.log('method1调用了');
console.log(name);
console.log(height);
}
}
Person();
method1(); //取到了name并打印出来。
console.log(name); //取不到name,报错
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
闭包
了解一下name 作用域从声明开始到 block 结束。
method1 的函数体在 block 内部,所以可以访问。
这个是闭包问题,可以参考这篇文章闭包
这个问题是这样的,Person 函数里有个 method1 函数,method1 函数没有 var 声明,所以当Person 函数执行后就生成了 method1 这么一个全局函数,所以在外部是可以执行 method1 ,由于 method1 函数是在 Person 函数内部,所以又可以获取到 Person 函数里面的东西,相当于一个桥梁。
作用域的特点是:里面可以一层层往外去搜索变量,但是外面不可以直接拿到里面的变量。
闭包
method1
有他声明时的作用域,同样因为闭包的特性,有时候会导致内存泄露,因为作用域被函数保存了。method1 在声明的时候捕获到了 变量name 形成了闭包,
首先Person()执行后,正常打印“Person调用了”,并且声明了全局变量method。由于method形成闭包,引用了变量name,因此name被保存在内存中,第二行调用method()时打印了内存中的name和全局定义的变量height,闭包执行结束,引用消失,name变量在内存中被销毁,第三行打印name时,全局定义中既没有变量声明或者初始化,因此报错。