美文网首页
js中作用域与作用域链

js中作用域与作用域链

作者: 程序员段子手 | 来源:发表于2016-12-01 21:54 被阅读0次

js中作用域与作用域链

作用域

*作用域基本概念

作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作用域就分别是全局和函数作用域。

示例1

var scope="global";  
function t(){  
    console.log(scope);  
    var scope="local"  
    console.log(scope);  
}  
t(); 
//此处打印结果是undefine local 此处有坑,正常理解 第一个应该打印出来global ,因为scope全局变量,但是js中有个声明提前,这个代码可以解读为示例2,看不懂的出去哭会

示例2

var scope="global";  
function t(){  
    var scope;  
    console.log(scope);  
    scope="local"  
    console.log(scope);  
}  
t();  
//进入函数中,变量声明提前,第一次打印出来的依然是局部变量,只不过没有赋值,所以是undefine,

示例3

var name="global";  
if(true){  
    var name="local";  
    console.log(name)  
}  
console.log(name);  
//正常思路:内部打印local,外部打印global,恭喜你掉坑里了,全部是local,js只有全局与函数作用域 if中的声明覆盖了全局变量都打印出来local

作用域链

简单说就是函数里调用函数1,函数1里调用函数2,那么就有了这么一个作用域链全局作用域==>函数1作用域==>函数2作用域;特点是函数1里面可以直接使用全局作用域的变量,函数2里面可以直接使用全局作用域和函数1作用域的变量
示例1

function t(){  
    var name="tlwy";  
    function s(){  
        var name="slwy";  
        console.log(name);  
    }  
    function ss(){  
        console.log(name);  
    }  
    s();  
    ss();  
}  
t();  
//当执行s时,将创建函数s的执行环境(调用对象),并将该对象置于链表开头,然后将函数t的调用对象链接在之后,最后是全局对象。然后从链表开头寻找变量name,很明显name是"slwy"。但执行ss()时,作用域链是: ss()->t()->window,所以name是”tlwy"

示例2

<head>  
<script type="text/javascript">  
function buttonInit(){  
    for(var i=1;i<4;i++){  
        var b=document.getElementById("button"+i);  
        b.addEventListener("click",function(){ alert("Button"+i);},false);  
    }  
}  
window.onload=buttonInit;  
</script>  
</head>  
<body>  
<button id="button1">Button1</button>  
<button id="button2">Button2</button>  
<button id="button3">Button3</button>  
</body>  
</html>  
//此处错误经常出现 点击事件接触是Button4;这是因为点击事件是在html加载之后才触发的 此时匿名函数没有i需要逐级向上查找,找到循环体此时i已经是4

相关文章

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • 作用域和作用链

    关键词:作用域作用链 作用域 js中没有块级作用域 全局作用域,函数作用域太简单,就不演示(≧▽≦)/啦啦啦 作用...

  • js中作用域与作用域链

    js中作用域与作用域链 作用域 *作用域基本概念 作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作...

  • 作用域与作用域链

    作用域与作用域链 一、作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域。 在JS中使用的是...

  • 作用域链&闭包&函数相关

    作用域链 在JS中函数可以创建作用域; 函数中又可以创建函数(可以开辟新的作用域); 函数内部的作用域可以访问外部...

  • 2018-12-18

    JS高级 作用域&作用域链 作用域: 1.作用域的个数:n(函数声明的个数)+1(全局作用域)2.作用域不会存储变...

  • 作用域与变量提升

    作用域与变量提升 作用域 JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • JS作用域&作用域链

    作用域&作用域链 作用域的概念 变量作用域的概念:变量作用域就是一个变量可以使用的范围。 JS中首先有一个最外层的...

  • JS 作用域链、导入导出

    1. JS 的作用域链 作用域在 JS 中表示变量的可访问性和可见性。JS 作用域有 3 种:1. 全局作用域;2...

网友评论

      本文标题:js中作用域与作用域链

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