JS作用域链


JS的变量的作用域可分为全局变量和局部变量
在JS函数内部可以直接读取全局变量,在函数内的局部变量外部是无法读取的,注意:局部变量必须用var命令声明,否则声明的实际是一个全局变量

  • 从外部读取局部变量,需要在函数内再建立一个函数

function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
    }
  }
此时,包含在f1中的f2就可以调用在f1中声明的局部变量n,父对象的所有变量,对子对象都是可见的,反之则不成立。

此时只需将f2作为返回值就可以看见f1中的局部变量了

作用域链实例

var a=1;
function fn1(){
function fn3(){
var a =4
fn2()
}
var a=2;
return fn3;
}
function fn2(){
console.log(a);
}
var fn=fn1()
fn()//1

输出fn()即输出fn1(),fn1返回值为fn3,fn3调用了fn2,fn2的输出结果为变量a的值,而fn2内部没有变量a,向其上一级即fn2的同级寻找,可以找到全局变量var a=1,因此最终的输出为1,在这里也遵守变量提升的规则。
变量 a 的值首先应当在函数声明的作用域中找,如果没有,再朝上一级找。切记是函数声明的作用域而非函数执行的作用域

JS中的变量类型

  1. 基本类型:数值,布尔值,字符串,null和undefined,指的是保存在栈内存中的简单数据段
  2. 引用类型:对象、数组、函数、正则,指的是保存在堆内存中的对象,变量中保存的实际上只是一个指针,一个地址,这个指针执行内存中的另一个位置,由该位置保存对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第 1 题 立即执行函数表达式是什么?有什么作用? 1. 立即执行函数是什么 立即执行函数就是 声明一个匿名函数 ...
    红豆丁244阅读 407评论 0 0
  • 给出两个不同的例子: 范例1: 分析上面代码:全局作用域中定义了变量x,function foo()以及funct...
    DeeJay_Y阅读 348评论 0 1
  • 纯干货,没有废话 先看题目,诸位自测 题目1 题目2 题目3 结果 解密 1、函数在执行时先从自己内部的局部作用域...
    allen_tian阅读 245评论 0 0
  • JS作用域链 如题1 题中fn()输出为2 说明:fn1()执行到最后是fn2(),fn2()内部没有定义变量,所...
    凛冬已至_123阅读 472评论 1 2
  • 变量提升 JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结...
    此人长期不在线阅读 242评论 0 0