作用域,预定解析,变量提升

 全局变量和局部变量的定义

全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。
(2)局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法)
(3)在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。

访问的规则


当我想获取一个变量的值的时候,我们管这个行为叫做访问
获取变量的规则:
首先,在自己的作用域内部查找,如果有,就直接拿来使用;
如果没有,就去上一级作用域查找,如果有,就拿来使用;
如果没有,就继续去上一级作用域查找,依次类推;
如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)

执行的阶段


当我想获取一个变量的值的时候,我们管这个行为叫做访问
获取变量的规则:
首先,在自己的作用域内部查找,如果有,就直接拿来使用;
如果没有,就去上一级作用域查找,如果有,就拿来使用;
如果没有,就继续去上一级作用域查找,依次类推;
如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)

函数提升和变量提升

  1.函数提升的实例

  2.变量提升的实例

 3.注意 函数的表达式不会进行提升

 原因: 函数表达式并不会被提升,只是简单地当做变量声明进行处理

4.预解析是分作用域的

定义: 声明提升并不是将所有的声明都提升到window对象下面,提升原则是提升到变量运行的环境(作用域)中去。

在es6之前没有块级作用域,只有全局作用域和函数作用域

if (true) {

 var a = 20

    }

 console.log(20);  //20

因此在{} 里面没有形参块级作用域

  1.经典案例

var a = 12

 function fn() {

      console.log(a);

      var a = 45

      console.log(a);

    }

    fn();

思路分析:  在进行编译前,函数内部 的代码会进行预编译,

var  a  console.log (a)  a=45  consoloe.log(a);

所以打印出来的结果是   underfined  和45

2.  函数传参的过程相当于在函数内部声明了一个局部变量

 var a = 1;

    function fn(a) {

      var a

      console.log(a); //undefined

      a = 3;

    }

    fn();

    console.log(a); //1

 解析:函数内部如果有变量的话,则函数内部直接赋值的话,是给函数内部的局部变量进行赋值

3.如果函数内部没有声明局部变量

   

 var a = 10;

function fn() {

      a = 20

    }

    fn()

解析:函数内部没有变量,直接赋值的话,是在全局上进行赋值

4.

var y = 'global';
function test(x){
    if(x){
        var y ='local';
    }
    return y;
}
console.log(test(true));
 
输出:local
 
与C++所不同的是,JavaScript中的作用域是函数作用域,而不是块级作用域,
第一句话中的y的作用域是全局,而函数中y的作用域是test函数,上面的程序会返回test中的y,故输出local

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值