龙空技术网

JavaScript 基础——作用域和作用域链

Mondo 122

前言:

当前我们对“js执行上下文与作用域”大致比较关怀,各位老铁们都需要了解一些“js执行上下文与作用域”的相关内容。那么小编在网上汇集了一些关于“js执行上下文与作用域””的相关知识,希望你们能喜欢,大家快快来学习一下吧!

作用域理解 就是一块“地盘”,一个代码段所在的区域它是静态的(相对于上下文对象),在编写代码时就确定了分类 全局作用域函数作用域没有块作用域(ES6有了,{} 作用域)作用 隔离变量,不同作用域同名变量不会有冲突

// 1. 全局作用域var a = 1var b = 2function fn(x) { // 2. fn作用域    var a = 3    var c = 4    console.log('fn', a, b, c, x)    function foo(x) { // 3. foo作用域        var a = 5        var d = 6        console.log('foo', a, b, c, d, x)    }    foo(20)    foo(30)}fn(10)

看定义函数多少来确认有(n + 1)个作用域

作用域与执行上下文区别1 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了,而不是在函数调用时全局执行上下文环境是在全局作用域确定之后,JS代码马上执行之前创建函数执行上下文是在调用函数时,函数体代码执行之前创建区别2 作用域是静态的,只要函数定义好就一直存在,且不会再变化执行上下文是动态的,调用函数时创建,函数调用结束时就会自动释放联系 执行上下文环境(对象)是从属于所在的作用域全局上下文环境 ==> 全局作用域函数上下文环境 ==> 对应的函数作用域作用域链理解 多个上下级关系的作用域形成的链,它的方向是从下向上(从内到外)的查找变量时就是沿着作用域链来查找查找一个变量的查找规则 在当前作用域下的执行上下文中查找对应的属性,如果有直接返回,否则进入下一步在上一级作用域的执行上下文中查找对应的属性,如果有直接返回,否则进入下一步再次执行上一步相同操作,直到全局作用域,如果还找不到就抛出找不到的异常

var a = 1function fn() {    var b = 2    function fn1() {        var c = 3        console.log(c)        console.log(b)        console.log(a)        console.log(d)    }    fn1()}fn() // 3, 2, 1, error
var x = 10function fn() { // fn作用域    console.log(x)}function foo(f) { // foo作用域    var x = 20    f()}foo(fn) // 10var obj = {    fn2: function() {        console.log(this.fn2)        console.log(fn2)    }}obj.fn2()

- END -

标签: #js执行上下文与作用域