2.0、作用域和预解析

一、作用域份为全局作用域和局部作用域
作用域不仅有有变量作用域还有函数作用域

var a = 10
    // a是全局作用域  在哪里都能访问和修改
function fn() {
    var b = 8 //这是局部作用域也成为函数作用域
    console.log(a) //10  a是全局作用域
}
console.log(b) //这里b是不存在的 会报
function fn() {
    var a = 10;
    console.log(a)

    function say() {
        var b = 2
        console.log(b) //2
        console.log(a) //10 可以访问到 
    }
    say() //可以调用
}
fn()
console.log(a) //报错
say() //报错

//预解析

   //预解析 热身运动

    console.log(b) //undefined
    var b = 10

    console.log(c) //报错
    c = 10
// js执行时 步骤
// 1、预解析
// 找东西  (var 函数 参数) 步骤:
// 1.var :找到var 给var 的变量赋一个undefined 提到最前面
// 2.函数: 找到函数整体提到最前面
// 3.参数:同var
//例如:
// console.log(b) //undefined
// var b = 10

// 找东西 
var a = undefined;
console.log(a) //所以 是undefined
var a = 10
    // 小案例:
var a = 10;
function fn() {
    console.log(a) //undefined
    var a = 5;
}
fn()
console.log(a) //10





           
            //首先预解析
            // 找var提到最前面
            // var a = undefined
            // 函数是一个作用域也要提到前面 进行预解析
            // 函数中的预解析
        // function fn() {
        //     找var a = undefined;
        //     console.log(a) //undefined  它是先看自己域中有没有这个值没有在往外找
        //     赋值 a = 5
        // }
          //赋值 a = 10
        // fn()
        // console.log(a) //10
        完事 逐行解读 

思考:

// 小案例:
var a = 10;

function fn() {
    console.log(a) //10
    a = 5;
}
fn()
console.log(a) //5

参数同var

 //预解析
    var a = undefined;

    function fn(a) {
        // 参数同var相当于
        a = undefined
        console.log(a) //undefined
        a = 2 //局部变量赋值
    }
    a = 10 //全局变量赋值
    fn()//注意这里是没有实参的
    console.log(a) //10

有实参

//有实参
var a = 10;
function fn(a) {
    console.log(a) //10
    a = 2
}
fn(a) //有实参
console.log(a) //10



        // 预解析
        var a = undefined
        function fn(a) {
            // 形参是实参传过来的  相当于这里有
            var a = 10; //局部变量
            console.log(a) //10
            a = 5 //给局部变量赋值
        }
        a = 10 //这里是全局变量
        fn(a)
        console.log(a) //10
    // 预解析如果同名
// 函数 > 参数和var
function fn(a) {
    var a = undefined //被覆盖var a = function a() {} 
    console.log(a) //是个函数 function a() {} 
    var a = 5; 他也干不过 变成了a = 5

    function a() {} //函数大于参数和var 直接覆盖
    console.log(a) //5
}
fn(1)

解决为什么函数表达式只能在定义后面调用

   fn() //报错
    var fn = function() {} //因为他提上去 var fn =undefined
    fn() //正常执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值