js中作用域 作用域链 闭包的理解
变量的作用域:全局变量和局部变量。
全局作用域:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的。
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部
作用域链:
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。
执行环境:
每个函数运行时都会产生一个执行环境,而这个执行环境怎么表示呢?js为每一个执行环境关联了一个变量对象。环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的执行环境,全局执行环境被认为是window对象,因此所有的全局变量和函数都作为window对象的属性和方法创建的。
js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。
**闭包:**闭包有两个作用:
第一个就是可以读取自身函数外部的变量(沿着作用域链寻找)
第二个就是让这些外部变量始终保存在内存中
**执行坏境,**它定义了变量或函数有访问的其他数据的能力,它决定了各自的行为,它的侧重点在于函数的作用域,而并不是所要纠结的上下文,一旦函数一声明定义,就会自动的分配产生了作用域,有着自己的执行坏境,执行坏境可以分为创建与执行两个阶段,在创建阶段,js解析器首先会创建一个变量对象(活动对象),它由定义在执行坏境中的变量,函数声明和参数组成,在这个阶段,系统会自动的产生一个this对象,作用域链会被初始化,随之,this的值也会被确定,第二阶段,也就是代码执行,代码会被解释执行,你会发现,每个执行坏境都有一个与之关联的变量对象,执行坏境中所有定义的变量和函数都保存在这个对象中,注意,我们是无法手动的访问这个对象的,只有js解析器才能够访问它,其实也就是this,尽管很抽象,但是理解它还是蛮重要的
例子:
<span style="font-size:18px;">var flag=1; function testChain(){ var flag=2; function chain1(){ var flag=3; console.log("f1: "+flag); } function chain2(){ function chainChild(){ var flag=4; console.log("f2: "+flag); } chainChild(); console.log("f3: "+flag); } chain1(); chain2(); } console.log("f4: "+flag); testChain();</span>
最终输出的结果是:f4: 1,f1: 3,f2: 4,f3: 2
对于f3的值是沿着 f3 ->chain2 -> testChain ->window 这条作用域链去找自己的值,最终在testChain上找到了值打印出来
this
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());//result:The Window
this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,因此this对象同常指向window
- 【学习笔记】深入理解js原型和闭包(18)——补充:上下文环境和作用域的关系
- js基础梳理-如何理解作用域和作用域链?
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- 对于JS语言的深刻理解(变量定义;作用域链;闭包;this)
- js的作用域、作用域链、闭包
- JavaScript关于作用域、作用域链和闭包的理解
- 深入彻底理解原生js的作用域、作用域链(以及浏览器是怎样解析js代码的)
- 理解js 的作用域链 原型链 闭包 词法分析
- 关于作用域、防止作用域污染、作用域链和闭包的理解
- JavaScript关于作用域、作用域链和闭包的理解
- Js函数深入理解-作用域链与闭包
- javascript理解之变量作用域与闭包
- js 作用域,作用域链,闭包
- javascript深入理解js闭包
- 深入理解Javascript 函数作用域 闭包
- JS闭包理解
- JS闭包理解
- js闭包理解
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- javascript 深入理解js闭包