JS高级——作用域链

基本概念

1、只要是函数就可以创造作用域

2、函数中又可以再创建函数

3、函数内部的作用域可以访问函数外部的作用域

4、如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链

<script>
    //f1--->全局
    function f1() {
        //f2--->f1--->全局
        function f2() {
            //f3---->f2--->f1--->全局
            function f3() {
            }

            //f4--->f2--->f1---->全局
            function f4() {
            }
        }

        //f5--->f1---->全局
        function f5() {
        }
    }
</script>

变量的搜索原则

1、首先在所在的作用域中查找

2、如果找到了 就直接使用

3、如果没有找到 就去上级作用域中查找

4、如果直到0级作用域链也就是全局作用域还没有找到,报错

在new Function中,在没有指定参数的情况下,函数中的Function对象作用域指示的又是全局

<script>
    var x= 123;
    function f(){
        var x = 100;
        //g.[[scope]]  == window
        var g = new Function("","alert(x)");
        g();
    }
    f();//结果为:123
</script>

原文地址:https://www.cnblogs.com/wuqiuxue/p/8341406.html

时间: 2024-07-31 07:13:52

JS高级——作用域链的相关文章

JS 之作用域链和闭包

1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(name); } Main(); </script>执行结果:{}即块级作用域. alex 2.JS采用函数作为作用域链 <script> function Main(){ var innerValue = "alex"; } Main(); console.log(in

js中作用域链的问题

为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止,如果全局中仍然没有这个变量的声明语句,那么会自动在全局作用域进行声明,这个就是js中的作用域链 <script> var i = 10; function f1() { //第一层 i = 20; function f2() { //第二层 i = 30; function f3() { //第

js改变作用域链

js有两种作用域:全局和局部 在最外层定义的变量拥有全局作用域,对任何内部函数来说,都是可以访问的:而局部作用域则只有内部函数定义的变量才拥有:在函数内部定义变量时,要使用var,否则定义的变量时全局变量 js是没有块级作用域的,因此for循环中的i在执行完循环后,还可以被同作用域的代码获取.js的作用域都是相对于函数而言,是函数作用域. js的作用域链: 每个函数执行都会生成一个执行环境,全局执行环境是最外围的执行环境且被认为是window对象,因此所有全局变量和函数都会作为window对象的

JS的作用域链与原型链

来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加载后会首先创建一个全局的作用域,然后每执行一个函数,会建立一个对应的作用域,从而形成了一条作用域链.每个作用域都有一条对应的作用域链,链头是全局作用域,链尾是当前函数作用域.作用域链的作用是用于解析标识符,当函数被创建时(不是执行),会将this.arguments.命名参数和该函数中的所有局部变量

JS的作用域链

一 作用域链可以被看作一种路径, 沿着这条路径可以确定变量的值.. 二 作用域链的特点 (1) var关键字决定了哪个函数是变量的作用域链的终点;(2) 当引用一个变量时, JS会沿着由对象执行路径构成的作用域链进行解析, 查找变量最近定义的值, 一旦找到, 即使用该值.. 三 作用域链的图例 四 作用域链实例 (1) function example() {var age = 23;}var age = 25;example();alert(age); // 将输出25 说明: 当执行exam

js中级-作用域链

作用域:浏览器给js的一个生存环境(栈内存). 作用域链:js中的关键字var和function 都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行执行,遇到变量就去内存地址查找是否存在这个变量.有就使用,没有就继续向父级作用域查找直到window下结束,这种查找机制叫作用域链. Js代码中存在着大量的变量和函数,我们在使用它们的时候一定要知道它们到底归属谁. 原文地址:https://www.cnblogs.com/wsxxy/p/10054775.ht

浅谈JS的作用域链(三)

前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Execution Context)的一个重要属性,是一个与执行上下文相关的特殊对象.因此,它可以叫作上下文对象(也就是用来指明执行上下文是在哪个上下文中被触发的对象). this不是变量对象(Variable Object)的一个属性,所以跟变量不同,this从不会参与到标识符解析过程.也就是说,在代

js 延长作用域链

function buildUrl() { var qs = "?debug=true"; with (location) { var url = href + qs; } return url; } console.log(buildUrl()) 在此,with 语句接收的是 location 对象,因此其变量对象中就包含了 location 对象的所有属 性和方法,而这个变量对象被添加到了作用域链的前端.buildUrl()函数中定义了一个变量 qs.当在 with 语句中引用变量

JS高级——作用域

作用域 1.js中没有块级作用域 2.如果有块级作用域,那么下面代码将会是undefined undefined <script> for (var i = 0; i < 10; i++) { var num = i; } console.log(i); console.log(num); </script> 词法作用域 1.就是在代码写好的那一刻,变量的作用域就已经确定了,这种作用域,就是所谓的词法作用域 2.和词法作用域相对的叫动态作用域 ,js中是词法作用域不是动态作用