js中作用域链的问题

为什么没有var声明的变量是全局的?

是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止,如果全局中仍然没有这个变量的声明语句,那么会自动在全局作用域进行声明,这个就是js中的作用域链

<script>
    var i = 10;
    function f1() {  //第一层
        i = 20;
        function f2() {  //第二层
            i = 30;
            function f3() {  //第三层
                i = 40;
            }
            f3();
        }
        f2();
    }
    f1();
    alert(i);  //40
</script>

这里  我们在每一层函数后面都进行了调用,f3调用,因为f3函数里面的i没有使用var声明,所以,会向上一层f2找,发现也没有声明,继续找f1,然后找到全局变量i,所以,就直接修改了i的值为40

下面是另一种情况,当这三层函数中,任意一层中有声明  i

这就是js的作用域链。

局部访问全局使用作用域链     (内部访问外部的变量就是通过作用域链)

全局访问局部可以使用闭包进行模拟

时间: 2024-10-25 11:51:15

js中作用域链的问题的相关文章

js改变作用域链

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

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中作用域与作用域链详解

一:函数作用域 先看一小段代码: [javascript] view plaincopy var scope="global"; function t(){ console.log(scope); var scope="local" console.log(scope); } t(); 第一句输出的是: "undefined",而不是 "global" 第二讲输出的是:"local" 你可能会认为第一句会输

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

JavaScript中作用域链和闭包

一.匿名函数 1.1 匿名函数的概念 ? 声明一个没有函数名的函数,就是匿名函数. ? 有函数名的函数就是具名函数. 看下面的代码: <script type="text/javascript"> /* //这里定义了一个函数,而且没有函数名.这样写语法是错误的,如果允许这样定义,那么根本就没有办法调用. //所以,我们可以用一个变量来存储一下 function(){ } */ // 声明了一个匿名函数,并把匿名函数赋值给变量f. 注意这个时候这个匿名函数并没有执行. va

JS中作用域和变量提升(hoisting)的深入理解

作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

js中级-作用域链

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