js声明变量等笔记

一、声明变量
1、var 
      var + 变量名
(1)函数体外声明的变量————全局变量  
      var x = 5
      function f1(){
        alert(x)   //5
      }
      f1()
      alert(x)   //5
(2)函数体内定义的变量————局部变量
        function f1() {
            var y = 6
            console.log((y)); //6
        }
        f1()
        console.log(y); //报错
(3)如果没有var 直接声明变量,会进行—隐式声明全局
        x = 5
        function f1() {
            console.log(x); //5
            y = 6
        }
        f1()
        console.log(x); //5
        console.log(y); //6
(4)window对象声明全局变量
        function f1() {
            var x = 6
            window.x = 5
        }
        f1()
        console.log(x); //5
(5)显示与隐式全局变量区别
        var v1 = "a"
        v2 = "b"
        window.v4 = "d";
        (function() {
            v3 = "c"
        })()
        console.log(v1);
        console.log(delete v1);    //false:  var 定义的全局变量不能被删除。
        console.log(v2);
        console.log(delete v2);    //true  没经过var定义的全局变量,无论函数体内或体外都可被删除。
        console.log(v3);
        console.log(delete v3);    //true
        console.log(v4);
        console.log(delete v4);    //true

2、变量提升
     将变量提升到函数的top位置,且只能提升变量的声明,不会提升赋值。
     如函数内部要访问全局,采用window.x或window["x"]
      (1)
                x = 1
        function f1() {
            console.log(x); //undefined
            console.log(window.x); //1
            console.log(window["x"]); //1
            var x = 2;
            console.log(x); //2
        }
        f1()
       (2)
               x = 1;
        (function() {
            console.log(x); //1
        })(window) 
       (3) 变量提升————全局作用域
               for (var i = 0; i < 3; i++) {
            console.log(i, m, k);   // 0 undefined undefined
            for (var m = 0; m < 3; m++) {
                var k = m + 1         //3
            }
            console.log(k);
        }

         变形:
                for (var i = 0; i < 3; i++) {
            console.log(i, m, k); //报错
            for (var m = 0; m < 3; m++) {
                k = m + 1 //k为隐式的全局变量,没有变量提升。
            }
            console.log(k);
        }
二、作用域
1、ES5————函数作用域
        function f1() {
            var y = 6
            console.log((y)); //6
        }
        f1()
        console.log(y); //报错      

        function fi(){
            let b=2
            vara=1
        }
        console.log(a)   //报错
        console.log(b)   //报错
2、全局作用域         
               for (var i = 0; i < 3; i++) {
            console.log(i, m, k);   // 0 undefined undefined
            for (var m = 0; m < 3; m++) {
                var k = m + 1         //3
            }
            console.log(k);
        }

         变形:
                for (var i = 0; i < 3; i++) {
            console.log(i, m, k); //报错
            for (var m = 0; m < 3; m++) {
                k = m + 1 //k为隐式的全局变量,没有变量提升。
            }
            console.log(k);
        }

3.ES6 --新增 块级作用域
     {}  if  和  for中的{}都属于块级作用域

(1)
{
    var a=1
    console.log(a)     //1
    let b=2
    console.log(b)  
}
(2)
if(true{
    var a=2
    let b=3
})
console.log(a)   //2
console.log(b)    //报错
(3)
for(var i=0;i<4;i++){
    var d=10
}
console.log(i)   //4
console.log(d)    //10

for(let i=0;i<4;i++){
    let d=10
}
console.log(i)   //报错
console.log(d)    //报错
三、setTimeout与setInterval 的区别  
    setTimeout:定时器  指定时间后执行
          setTimeout(csh,3000);
          function csh(){
            console.log('javascript')
          }
          clearTimeout(timmer)  //清除定时器
    
    seInterval:间歇调用,每个指定时间调用内容
          seInterval(csh,3000);
          function csh(){
            console.log('javascript')
          }
          clearTimeout(timmer)


(4)异步情况下 变量传递
          for (var i = 0; i < 3; i++) {
            setTimeout(function() {
                console.log(i)
            }, 100)
        }   
        //3  3  3  异步调用 循环已结束

        解决
         for(var i=0;i<3;i++){
            setTimeout((function(){
                return function(){console.log()}
            })(i),100)
         }

四、var let const区别
ES6  新增--let   const
var 对函数作用域有效,对块级作用域无效
    允许一个变量声明多次
    var可以进行变量提升(暂时性死区)
    var声明的变量会成为window对象的属性 window.a
    for循环中的迭代变量(var i),var声明会渗透到循环体外

let 对函数作用域和块级作用域都有效
    不允许出现陈余变量(不允许一个变量声明多次)
    let没有变量提升(暂时性死区)
    let声明的变量不会成为window对象的属性
    for循环中的迭代变量(let i),let声明会渗透到循环体外

const 定义常量
      常量不允许修改
           --特殊:const定义的引用类型仅保证指针不发生改变内容允许被修改
      只能在块级作用域、函数作用域都有效
      不允许重复定义变量


   var a
        var a
        let b
        let b  //报错

        var a=5
        let b=6
        console.log(a)


    var a=5
    alert(window.a)   //5
    let b=6
    alert(window.b)   //undefined

    for(var i=0;i<5;i++){

    }
    console.log(i)   //5

    for(leti=0;i<5;i++){

    }
    console.log(i)   //报错


    {
        const a=5
        a=6       //报错
    }
    console.log(a)   //报错

    function f1(){
        const a=5
    }
    console.log(a)   //报错


    const a=5
    const a=6

    const p1{"name":"zs","age":23}
    p1.name="ls"
    console.log(p1.name)    //ls

    p1{}   //报错,改变地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_诸葛亮晶晶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值