javascript 作用域的疑惑

发布于 2022-09-11 21:49:33 字数 535 浏览 22 评论 0

题目描述

//这段代码让人困惑,为什么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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

挖个坑埋了你 2022-09-18 21:49:34

闭包 了解一下

拥抱没勇气 2022-09-18 21:49:33

name 作用域从声明开始到 block 结束。

method1 的函数体在 block 内部,所以可以访问。

时间海 2022-09-18 21:49:33

这个是闭包问题,可以参考这篇文章闭包

一念一轮回 2022-09-18 21:49:33

这个问题是这样的,Person 函数里有个 method1 函数,method1 函数没有 var 声明,所以当Person 函数执行后就生成了 method1 这么一个全局函数,所以在外部是可以执行 method1 ,由于 method1 函数是在 Person 函数内部,所以又可以获取到 Person 函数里面的东西,相当于一个桥梁。

作用域的特点是:里面可以一层层往外去搜索变量,但是外面不可以直接拿到里面的变量。

画尸师 2022-09-18 21:49:33

闭包

method1有他声明时的作用域,同样因为闭包的特性,有时候会导致内存泄露,因为作用域被函数保存了。

小嗲 2022-09-18 21:49:33

method1 在声明的时候捕获到了 变量name 形成了闭包,

北座城市 2022-09-18 21:49:33
  1. 闭包
  2. ES5中声明变量前不用var关键字,默认为全局变量,如变量method。

首先Person()执行后,正常打印“Person调用了”,并且声明了全局变量method。由于method形成闭包,引用了变量name,因此name被保存在内存中,第二行调用method()时打印了内存中的name和全局定义的变量height,闭包执行结束,引用消失,name变量在内存中被销毁,第三行打印name时,全局定义中既没有变量声明或者初始化,因此报错。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文