声明遍量 作用域

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

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

???(4)异步情况下变量传递
for(var i=0;i<3;i++){
    setTimeout(function(){
        console.log(i);
    },100)
} console.log(3);
异步调用,循环已结束
解决:立即执行函数
for(var i=0;i<3;i++){
    setTimeout((function(m){
    return function(){console.log(m)} 
})(i),100)
}
//0 1 2

二丶作用域
1.ES5--函数作用域
 function f1() {
            var y=6
            alert(y) //6
        }
        f1()
        alert(y) //报错
2.ES5--全局作用域
预编译
       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
    }
    console.log(k)  //3  1 3 3  3  2 3 3   3
}
变形:
       for(var i=0;i<3;i++){
    console.log(i,m,k) //报错
    for(var m=0;m<3;m++){
         k=m+1
    }
    console.log(k)  
}
3.ES6--新增 块级作用域
{}、if和for中的{}都属于作用域
(1){
    var a=1
    console.log(a)  //1
    let b=2
    console.log(b)  //2
}

(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

(3)for(let i=0;i<4;i++){
    let d=10
}
console.log(i)  //报错
console.log(d)  //报错

function f1(){
    let b=2
    var a=1
}
console.log(a);  //报错
console.log(b);   //报错
 
        

三丶setTimeout与setInterval
setTimeout:定时器  指定时间后执行
         var timmer=setTimeout(csh, 3000);
         function csh() {
                   console.log('javascript')
               }
         clearTimeout(timmer) //清除定时器
       
    setInterval:间歇调用,每个指定时间调用内容
           var timmer=setInterval(csh, 3000);
           function csh() {
                 console.log('javascript')
                        }
           clearInterval(timmer)

四丶var let const区别
ES6新增--let const
var 对函数作用域有效,对块级作用域无效
let 对函数作用域和有块级作用域效

var 对函数作用域有效,对块级作用域无效
    允许一个变量声明多次
let  对函数作用域有效,对块级作用域无效
     不允许出现几条声明(不允许一个变量声明多次)

var 可以进行变量提升
let 没有变量提升(暂时性死区)

var 声明的变量会成为window对象属性 window.a
let 声明的变量不会成为window对象属性

for循环中的迭代变量(var i),var声明会渗透到循环体外
for循环中的迭代变量(let i),let声明不会渗透到循环体外


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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值