JavaScript 变量

Var Let Const 变量区别

var 全局变量 ,有预解析,存在变量提升 属于window,函数中定义的var仅可在局部使用

const 局部变量,定义好后不能改变

let 局部变量,没有预解析,不存在变量提升

代码全局/局部体现:

 //var 可以alert 
 //const 与 let 报错未定义
    if (true) {
        //var a=12;  
        // const a=12
        let a = 12;
     }
  alert(a); // a is not defined

代码变量提升体现:

1.alert将会弹出undefined var a=5 变量默认在alert前面会定义一个var a

2.如将let a=12 改成 var a=12 alert依旧会弹出 undefined 优先内部

   let a = 12;
     function fn() {
         alert(a); 
         var a = 5;
      }
   fn()

3.function与var一样具有变量提升

fn()//6
function fn() { console.log(1) }
function fn() { console.log(2) }
var fn = function () {
    console.log(3)
}
fn()//3
function fn() { console.log(4) }
function fn() { console.log(5) }
function fn() { console.log(6) }
fn()//3
​
​
//实际运行 function具有变量提升  先将所有funcion 在顶层定义好了  输出633
function fn() { console.log(1) }
function fn() { console.log(2) }
function fn() { console.log(4) }
function fn() { console.log(5) }
function fn() { console.log(6) }
fn()//6
var fn = function () {
    console.log(3)
}
fn()//3
fn()//3

函数中定义的var仅可在局部使用1:

   
 function test() {
         if (false) {
             var testval = 'aaa'
         }
    }
    test()
    console.log(testval)//testval is not defined

函数中定义的var仅可在局部使用2:

   function test() {
        console.log(text) //aa
    }
    function test2() {
        var text = 'bb'
        console.log(text)  //bb
        test()
    }
    var text = 'aa'
    test2()

for是一个作用域 let i=''abc' 也是一个作用域

  for(let i = 0; i<3; i++){
       let i = 'abc';
       console.log(i);//打印将三次abc
   }
​

作用域问题:

   for (let i = 0; i < 10; i++) {
       console.log(i); //1~9
   }
    console.log(i); //i is not defined
​
   for (var i = 0; i < 10; i++) {
       console.log(i); //1~9
   }
    console.log(i); //10

var :for循环中var 是全局范围内都有效,所以全局就一个i.每次循环i都发生变化,console的i指向的是全局的i

let:当前i只在每次循环的时候有效,所以每次循环都是一个新的变量

var arr = [];
      for (let i = 0; i < 3; i++) {
         arr[i] = function () {
            console.log(i); //2
          }
      }
 arr[2]();
​
var arr2 = [];
      for (var i = 0; i < 3; i++) {
         arr2[i] = function () {
            console.log(i); //3
          }
      }
 arr2[2]();
​
for (var i = 0; i < 2; i++) {
    setTimeout(() => {
        console.log(i)  // 2 , 2
    }, 10)
}
​
for (var i = 0; i < 2; i++) {
    ~function (i) {
        setTimeout(() => {
            console.log(i) // 0, 1
        }, 10)
    }(i)
}
​

不允许重复声明:

//报错
function(){
  let a=1;
  var a=2
}
//报错
function(){
    let a=1;
    let a=2
}
//报错
function func(arg){
    let arg
}
//不报错
function func(arg){
  {  
     let arg
   }
}

const 无法更改,例如:

 const a = 12;
       a = 5;
 console.log(a); //Assignment to constant variable.

const 可以使用push之类的,例如:

  const arr =['a','b'];
  arr.push('c');
  console.log(arr);//['a','b','c'] 

const 如果什么都不能进行操作 可以使用 Object.freeze ,例子:

 const arr = Object.freeze(['a','b']);
 arr.push('c');
 console.log(arr);// Cannot add property 2, object is not extensible

块级作用域原因:

1.内部变量可能会覆盖外部变量

var a='abc'
function func(){
    console.log(a)
    if(true){
      var a='bcd'
    }
}
func()//'undefined'

2.计数泄露

for(var i=0;i<10;i++){
    console.log(i)
}
console.log(i)//10

顶层对象的属性 浏览器中顶层对象是winodw ,ebworker与node没有winodw ,web worker顶层是self,node也没有self,node顶层是global

var a=1
window.a //1
let b=1
window.b //undefined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值