JS作用域&作用域链

自闭症网瘾萝莉.ら 提交于 2019-12-24 01:10:26

作用域的概念:
变量作用域的概念:变量作用域就是指一个变量可以使用的范围
全局作用域:代码在程序的任何地方都能被访问,window的内置属性都具有全局作用域,是js中最外层作用域
函数作用域:在固定的代码片段才能被访问,通过函数创建一个独立的作用域,函数是可以嵌套的,所以作用域也是可以嵌套的
作用域的做大用处就是隔离变量,不同作用域下同名变量不会有冲突
变量取值:到创建这个变量的函数的作用域中取值

var age = 18; // age是在全局作用域中声明的变量,即为全局变量
function f1(){
    console.log(name); // 此处可以访问到name变量,输出undefined
    // 这里为何输出undefined,是由于变量提升造成的,见附录1
    
    // name是f1函数内部声明的变量,所以name变量的作用域就是在f1函数内部
    var name = "hello";
    console.log(name); // 可以访问到name变量
    console.log(age); // age是全局作用域中声明的变量,所以在f1函数内部也可以访问
}
console.log(age); // 此处可以访问
console.log(age); // 此处不可以访问name,因为name变量在函数f1内部声明的,属于局部变量,所以在全局作用域中无法访问。

作用域链(链式调用机制)的概念:
作用域链的定义:函数在调用变量时会从当前作用域到上级作用域中逐个“搜索”变量,一直找到最外层的全局作用域,如果全局作用域中也不存在,则认为这个变量underfined,就像沿着一条链子一样去搜索,就是作用域的链式调用。
作用域链的意义:查找变量(确定变量来自于哪里,变量是否可以访问)
每一段JavaScript代码(全局代码或函数)都会有一个与之关联的作用域链,这个作用域链是一个对象列表或链表,这组对象定义了这段代码“作用域中“的变量。

function fn(callback){
    var age = 20;
    callback();
}
fn(function(){
    console.log(age);//报错
    //1.在当前作用域没有查找到age
    //2.查找上一级作用域:全局作用域
    //为何是全局作用域?因为看上一级作用域,不是看函数在哪调用,而是看函数在哪编写的。    
    //这种特别的作用域,叫做“词法作用域”
})

上级作用域是谁?这里需要引出一个概念,查找函数上级作用域,不是看函数在哪调用,而是看函数在哪编写。所以这样来看,上级作用域就是全局作用域。
如果查找一个变量时,在当前作用域找到变量,不管上级、上上级有没有同名变量都不会再去寻找。

例子

例子
var name="张三";
    function f1(){
        console.log(name);
        var name = "abc";
    }
f1(); // undefined

上面例子结果返回undefined,原因是函数内的局部变量name发生了变量提升机制
变量提升的概念:
函数和变量的声明会被js的解释器放到最上面,赋值位置不变
上面例子中函数内的局部变量name会被放到函数内的最顶部,预先声明,但没有赋值,当console.log打印结果时name只是声明,所以结果为undefined
变量提升:变量赋值并没有被提升,只是声明被提升了
函数提升:整个函数都会被提升

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!