js 作用域学习

1.var happy='huhu';
alert(happy);
//定义然后输出,no problem

2.alert(happy);
//没有定义,自然不ok

3.happy='huhu';
//直接给一个变量负值也是不会出错,因为这先当于创建了一个全局的变量。隐式声明了一个变量


4.alert(happy);
var happy='huhu';//happy==undefined;相当于。var haapy;-->alert(happy)-->happy='huhu';
happy='huhu'//如果不写var的时候还是会出错


5.var happy='huhu';
function show(){
    alert(happy);//输出huhu,访问外部的变量
    happy='heihei';//虽然这里改变了外部变量,但是函数完以后会回收这里。所以你不停的刷机会是huhu
    //alert(happy);
}
show();


6.var happy='huhu';
function show(){
    alert(happy);//undefined,这里在局部查找变量的时候会找到一个声明确为定义的happy。
    var happy='heihei';    
}
show();


7.var hppay=[1,2,3];
function show(){
    if(typeof hppay=='undefined'){
        hppay=[];
    }    
    alert(hppay.length);//3 happy为array不为undefined
}
show();

var hppay1=[1,2,3];
function show1(){
    if(typeof hppay1=='undefined'){
        var hppay1=[];
    }    
    alert(hppay1.length);//0
}
show1();
//相当于
function show1(){
    var happpy; //此时alert(happy)为undefined
    if(typeof happy1='undefined'){
        var happy1=[];
    }    
};


8.alert(typeof happy);//function
function happy(){};//采用函数定义式声明的方法,函数的定义会提前;而采用函数表达式声明的方法,函数的定义,跟采用var声明的局部变量一样,函数声明会提前,但函数定义位置不变,

alert(typeof happy1);//undefined
var happy1=function(){};//函数表达式的这种写法,相当于声明了一个变量。



9.var happy={name:'huhu'};
function happy(){
    alert('执行了');    //报错functon 不是一个函数,为什么这里不能提前了呢?
}
happy();
//模拟代码如下
alert(happy);//function
var happy={name:'huhu'};
alert(happy);//object
function happy(){
    alert('执行了');    
}

happy();
原文地址:https://www.cnblogs.com/wannasing/p/3067309.html