javascript 表达式函数、声明函数的区别,及其执行顺序

今天闲来之际,做了一个小TEST ,主要是看关于命名函数和声明函数 写成类它们之间的 区别。

javascript 函数分为三大类:表达式函数、声明函数、自执行函数(属于匿名函数,在这里不再详以说明)

表达式函数的特性:在作用域中则必须等到解析器执行到它所在的代码行,才会真正被解释执行。如下示例

test1();//会提示 Property 'test' of object [object Object] is not a function

var test1= function(){ return "sucess" ;}

test1();//会返回结果 sucess

 

声明函数:javaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面

 

test(); //返回结果为sucess1

 

function test(){

   return "sucess1";

}

第一种情况:在相同性的声明表达式函数会执行第二个的声明,因为最后一个出现的,要远远高于第一个出现的

 

 

test(); //返回结果为sucess2

 

function test(){

   return "sucess1";

}

 

 

function test(){

   return "sucess2";

}

自执行函数:  和java中的static 函数相似 ,可以自动执行无需触发 在其作用域中的声变量不会和外界受影响,不会存在命名冲突的问题

 

var vt="welocome you ";

(function () {
 var vt="dddd12222";
alert(test); //输出的值为dddd12222
})();
alert(vt); //输出的值为welcome you

 

第二种情况:表达式相继的在页面上出现,在调用时后出现的会覆盖前面出现的

var aa=function(){return "11"}

var aa=function(){return "22"}

alert(aa);//输出结果为22 

 

第三种情况:表达式函数和声明函数相同名函数同时出现,以照顺序,如果是表达式函数在最前 所有的调用都会使用表达式函数:

 

 

var Person = function(name){
    this.name=name;
     this.write=function(){
          alert(this.name+"1");
     }
    }
var p=new Person('jack');   
p.write();                     //结果:jack1


function Person(name,age){
        this.name=name;
        this.age=age;
        this.write=function(){
            console.log("my name is "+this.name+" ,my age is "+this.age);
        }
}

var p2=new Person('wilon',22);
p2.write();//结果为wilon1

debugger;

function Person(name){
    this.name=name+"2";
    this.write=function(obj){
        alert(this.name+obj);
        }
    }

var p3= new Person('brown');
p3.write(' white');    //结果为brown1

 

第四种情况:表达式函数在后,引用在前,会调用最后一个声明函数  ,在表达式函数后的引用 ,调用的还是表达式函数

 

 


var p=new Person('jack');   
p.write();                     //结果:jack2


var Person = function(name){
    this.name=name;
     this.write=function(){
          alert(this.name+"1");
     }
    }

 

 

 

function Person(name,age){
        this.name=name;
        this.age=age;
        this.write=function(){
            console.log("my name is "+this.name+" ,my age is "+this.age);
        }
}

var p2=new Person('wilon',22);
p2.write();//结果为wilon1

debugger;

function Person(name){
    this.name=name+"2";
    this.write=function(obj){
        alert(this.name+obj);
        }
    }

var p3= new Person('brown');
p3.write(' white');    //结果为brown1

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值