今天闲来之际,做了一个小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