美文网首页
JS执行环境及作用域

JS执行环境及作用域

作者: 一条没有梦想的老咸鱼 | 来源:发表于2019-02-26 15:17 被阅读0次

执行环境是JavaScript中很重要的概念。执行环境定义了变量有权访问其它数据。

全局执行环境就是最外围的环境,在web浏览器中全局执行环境被认为是window对象,也就是说我们在全局环境中创建的变量和函数都是作为window对象的属性而存在的。

var a = "window对象的属性a"
function fun(){
    console.log("所有在全局执行环境中创建的变量 函数都是作为window对象的属性而存在的")
} 
window.fun();
console.log(window.a)
/*
所有在全局执行环境中创建的变量 函数都是作为window对象的属性而存在的
window对象的属性a
*/

当某个执行环境中的所有代码执行完毕后,保存在其中的所有变量和函数也会随即销毁(但是全局执行环境知道应用程序退出才会被销毁)

每个函数都有自己的执行环境。当执行到这个函数时这个函数的环境就会被推入环境栈中。而在函数执行之后,栈会把这个函数的执行环境弹出把控制权交还给之前的执行环境

当代码在一个环境中执行的时候会创建作用域链。作用域链的主要作用是保证对执行环境有权的访问的所有变量和函数的有序访问。作用域链的前端始终是当前执行环境下创建的变量

当某个执行环境要读取或写入一个标识符时,就会开始搜索这个标识符。搜索过程是从作用域的前端开始搜索,如果没有搜索到就向上逐级找符合名字匹配的标识符

(标识符用指的是 变量、函数、属性的名字,或者函数的参数)

var a = 1;
function fn1(){
    function fn2(){
        console.log(a);
    }
    function fn3(){
        var a = 4;
        fn2();
    }
    var a = 2;
    return fn3
}
var fn = fn1();
fn();
//最后的输出结果2

上面这个示例最后的输出结果为2,这个例子对初学者来说并不友好。但是理解了上面这个例子就基本理解了作用域运行的规则。
首先 我们定义了函数fn1(),然后我们又在fn1内部创建了两个函数分别为fn2、fn3。然后再var a = 2;最后面return fn3,然后var fn = fn1();由于前面return fn3 所以调用fn()其实是在调用fn3
fn3()又调用了fn2()然后我们就会进入了fn()的作用域,这个时候我们就应该是从fn2的视角中寻找a,fn2内部并没有a所以他会向上级寻找也就是fn1,由于在变量始终在起当前作用域的最前端,所以最终结果为2

然后我们再看一个例子:

var color = "blue";
function changeColor(){
    var anotherColor= "red";
    function swapColor(){
        var tempColor = anotherColor
        anotherColor = color;
        color = tempColor;
        //这里可以访问到color、anotherColor和tempColor
    }
    //这里可以访问color和anotherColor,但不能访问tempColor
}
//这里只能访问color
changeColor();

这个例子表现就是 搜索标识符的时候只会沿着作用域上寻。

相关文章

  • JS执行环境及作用域

    执行环境是JavaScript中很重要的概念。执行环境定义了变量有权访问其它数据。 全局执行环境就是最外围的环境,...

  • JS学习之执行环境和作用域

    JS学习之执行环境和作用域 执行环境和作用域相关介绍 执行环境 执行环境定义了变量或函数有权访问的其他数据,决定了...

  • javascript的执行上下文—作用域链 闭包

    js作用域:函数作用域、全局作用域作用域链:由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访...

  • js函数中的this

    前两篇文章“执行环境和作用域”和“js中的闭包”,我对谈了执行环境、作用域、作用域链和闭包的理解。但当牵涉到对象中...

  • 作用域与this

    作用域与 this 一、作用域 1.1 JS 中的内存空间分为两种: 栈内存:提供 js 代码的执行环境;存储基本...

  • JS 作用域与作用域链

    1. 作用域 作用域就是代码的执行环境,全局执行环境就是全局作用域,函数的执行环境就是私有作用域,它们都是栈内存。...

  • 作用域和作用域链

    1. 作用域 作用域就是代码的执行环境,全局执行环境就是全局作用域,函数的执行环境就是私有作用域,它们都是栈内存。...

  • 执行环境及作用域

    执行环境 执行环境(execution context),定义了变量或函数有权访问的其他数据,决定了它们各自的行为...

  • 执行环境及作用域

    作用域的作用:保证对执行环境有权访问的所有变量和函数有序访问。 函数执行时,标识符解析会沿着作用域链向上一级一级查...

  • 执行环境 & 作用域 & 闭包

    执行环境 & 作用域 & 闭包 执行环境 , 作用域 , 闭包 , 闭包应用 执行环境 执行环境定义了 当前环境的...

网友评论

      本文标题:JS执行环境及作用域

      本文链接:https://www.haomeiwen.com/subject/dwiayqtx.html