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,报错







阅读 2.7k
7 个回答

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

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

新手上路,请多包涵

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

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

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

闭包

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

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

  1. 闭包
  2. ES5中声明变量前不用var关键字,默认为全局变量,如变量method。

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

闭包 了解一下

推荐问题
宣传栏