作用域以及作用域链

作用域

作用域就是变量和函数得可访问范围,控制着变量和函数得可见性与生命周期,

在JavaScript中变量的作用域:全局作用域和局部作用域

全局作用域:任何函数的内部都可以访问的到

  var jeck = "jeck"

    function fn() {
    
        console.log(jeck)
    }
    fn() //result:jeck

局部租作用域:一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的

  function fn() {

        console.log(jeck); //undefined

        var jeck= "jeck";

        console.log(jeck); //jeck

    }

    fn();

    console.log(jeck); // ReferenceError: jeckis not defined

注意:只要函数内定了局部变量,函数在解析的时候都会将这个变量“提前声明”

 function fn() {

        var jeck; //提前声明了局部变量

        console.log(jeck) //undefined

        jeck = "jeck"

        console.log(jeck) //jeck
    }
    fn()
    
    console.log(jeck) // ReferenceError: inner is not defined

函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

function fn(){

        jeck = "jeck"
    }
    fn()

    console.log(jeck) //jeck

块级作用域

在java中作用域就是一个{}花括号是会计作用域,而在JavaScript没有块级作用域,只有函数作用域。

ES6中的作用域

由于ES5中存在很多问题,所以在ES6中,用let替换了var的声明,不过为了兼容ES5还是可以使用以前的var。不过还是建议用let
let为js添加了新的作用域就是块级作用域。

 for (let i = 0; i < 10; i++) {
        
        console.log(i) //0,1,2,3,4,5,6,7,8,9
    }
    console.log(i) //i is not defined

我们就完全可以使用java等语言,来理解变量的声明了,而且使用let声明变量,再声明是不可以用的

 a = 3

    let a = 100

    alert(a) // a is not defined

let不像var那样会发生“变量提升”现象,所以,变量一定要在声明后使用,否则报错
ES6明确规定,如果区块内存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,在语法上称为暂时性死区

作用域链(SCOPE Chain)

作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问

我的理解就是,根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。

  name = "1"

    function t() {
        var name = "2"

        function s() {
            var name = "3"
            console.log(name)
        }

        function ss() {
            console.log(name)
        }
        s() //3
        ss() //2
    }

    t()

延长作用域链
with语句:with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部

  person={name:"wj",age:20,height:165,friend:{name:"wtw",age:21}};
    with(person.friend){
    console.log(name); //wtw
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值