var、let、const、函数、定义变量使用

1、var定义变量、函数

1、console.log(a)   //undefined 而不是 is not defined   只有var定义的变量会提升,let const没有。
var a=3;
相当于: 
 var a;  //undefined
   a=3;  
 
  alert(g); //  g is not defined  说明全局没有定义这个变量。就直接打印
   
console.log( demo)   //  下面定义变量    undefined
var demo=function(){
相当于:var demo;
demo=function(){}

2、函数声明: function 函数名(){    //代码块 }    //有提升
console.log(fun);  //function fun(){}    
console.log(JSON.stringify(fun));   // undefined
console.log(typeof(fun));  // function  判断是什么数据类型  
function fun(){       }

3、函数表达式:  var 变量=function(){    //代码块  }    //不会提升,代码解析到了就执行。
console.log(fun)   //undefined
var fun=function(){     }

4、函数声明与定义变量都是同一个名字相同哪个会优先
    console.log(typeof(fun));      //function  是函数类型
    var fun=30;
    console.log(typeof(fun))       //number  是数字类型
    function fun(){
    }
   console.log(typeof(fun))                   // number  数字类型
-------------------------------------------------------------------------------------
console.log(typeof(fun))       //function 
function fun(){   }
console.log( typeof(fun))      //  function 
var fun=30;
console.log(typeof(fun))       //  number

综上结果:函数声明提升优先于定义变量提升。

例子:   num=30
        function fun(){
                    window.num=20;
                    console.log(num);  //undefined   因为下面定义的num是提升了。所以是undefined
                    var num;
                   console.log(window.num)  //20
         }
         fun();

5、当函数声明与函数表达式同一个名字时候
var ledi;
function ledi(){
    alert('1');
};  
ledi();   // 1
var ledi = function (){
    alert('22');
};  
ledi();  //22  
讲解:函数声明有提升,并且函数声明覆盖变量声明,但不会覆盖其值,先执行声明的函数,之后表达式覆盖声明的,所以最后执行表达式的函数。

6、变量,形参同名同时出现时
var num1 = 1; 
function   fn(num3){ 
    console.log(num1);    
    console.log(num3);     
    console.log(num4);    
    console.log(num2);    
    var num1 = num4 = 2;     //这种写法表示:最前面一个是局部变量,后面的都是全局变量。num1、num4的值都是4
    num2 = 3;  
    var num3= 5;   
}   
fn(4);
声明变量num1和函数fn,函数fn中也要进行预编译,定义变量num1和num3。
		1.console.log(num1);
		这时候num1虽然定义了但还没赋值,所以输出undefined
		2.console.log(num3);
		这时候num3定义了也没赋值,但是参数传了4进来,执行顺序是参数>变量,所以输出4
		但要注意,如果var num3= 5;这句话在console.log(num3);前面,即使参数传进来,依然输出变量的值即5
		3.console.log(num4);
		连续赋值操作,除了第一个变量以外的变量都被视为全局变量处理,但是因为全局变量没有定义,所以报错"num4 is not defined"
		如果num4=2;这句话在console.log(num4);前面了,那就输出2
		4.console.log(num2);
		全局变量同理,报错"num2 is not defined"

7、变量声明、函数声明、形参同时出现
function aa(a,b,c){
    function a(){}
    console.log(a);
    console.log(aa);
    console.log(arguments);
    var a="ee";
    var aa="444";
    arguments=6;
    console.log(a);
    console.log(aa);
    console.log(arguments);
}
aa(1,2,3)
		1.console.log(a);
		变量a声明了但未赋值,被同名形参覆盖,此时a为1,但是又被同名函数覆盖,所以输出function a(){}
		2.console.log(aa);
		变量aa声明了但未赋值,所以输出undefined
		3.console.log(arguments);
		传了参数1,2,3进来,本来输出[1,2,3],但是同名函数a覆盖了参数,所以输出[a(),2,3]
		后三句因为重新赋值,所以相继输出
		ee
		444
		6

8、自执行函数声明
(function d(num){
   	console.log(num);  //100   参数优先级大于定义变量
   	var num=10;
}(100))

(function fn(num){
  	console.log(num); //function num(){}  函数声明优先级大于参数变量
  	var num=10;
  	function num(){};
}(100))

(function fn2(num){
    function num(){};
  	console.log(num); //function num(){}
  	var num=10;
  	console.log(num); //10
 }(100))

9、function m(){
        	console.log(a1); //undefined
        	console.log(a2); //undefined
        	console.log(b1); //undefined
        	console.log(b2); //undefined
        	if(false){ //不弹出s提示
        		alert("s");
        		function b1(){}
        		var a1=10;
        	}
        	if(true){
        		alert("2"); //弹出了2
        		function b2(){}
        		var a2=10;
        	}
        	console.log(a1); //undefined
        	console.log(a2); //10
        	console.log(b1); //undefined
        	console.log(b2); //function b2(){}
        }
        m();

2、let、const定义函数变量(都是块级作用域)


const:与let差不多,用来声明恒定的变量即常量,而且声明的时候必须要赋值否则会报错
const PI;  //报错              正确写法:       const PI=3.14
PI=3.14;                                       console.log(PI)
console.log(PI)

let 的使用:
1、let 声明的变量只能处于块级作用域有效,不能声明多个一样的变量。
2、let没有变量提升,而是暂时性死区特性。
var a=3;
function   fun()(  
     console.log(1)   //1
     console.log(a)   //暂时性死区   提示:a is not defined
     console.log(2)  //不会执行
     let a=2;  //不会执行
 )
fun();

解决一些问题
for(var i=0;i<2;i++){
	 console.log(i)   // 0,1
}
console.log(i)    //2

var   arr=[];
for(var i=0;i<2;i++){
   arr[i]=function(){
       console.log(i);
   }
}
arr[0]()  //2
arr[1]()  //2
----------------------------------改成let定义后
var   arr=[];
for(let i=0;i<2;i++){
   arr[i]=function(){
       console.log(i);
   }
}
arr[0]()  //0
arr[1]()  //1
--------------------------------------------
var a=12;
function fun(){
	console.log("值呢:"+a);    //undefined
	return 4;
	console.log(1);  //不会执行
	var a=45; //不会执行
}
fun()

----------------------------------------------
var z=3;  //全局作用域
function x(){
	var z=4;  //局部作用域
	function s(){
		console.log(z);  //4
	}
	s();
}
x();
console.log(z);  //3 
-------------------------------------
var a=12;
function fun(){
	console.log("值呢:"+a);  //undefined
	return 4;  //return 后面代码不执行
	console.log(23)  //不执行
	var a=45;  //定义的变量会提升
}
fun()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值