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()