js(es5)定义函数三种形式笔记

js(es5)定义函数三种形式笔记

1. 定义函数3种形式:

  1. function语句形式定义函数
  2. function直接量定义函数
  3. Function构造函数形式定义函数

实例1:三种形式的写法

//语句形式定义函数				
function test1(){ 
	
		alert("hello function1");
 	}
//直接量形式定义函数
var test2=function(){
	
		alert("hello function2");
	}
//直接量形式定义函数
var test3=new Function("a","b","return a+b");
//调用函数
test1();//输出hello function1
test2();//输出hello function2
alert(test3(1,2));//输出3

三种函数的对比:

三种函数形式效率对比:

  1. function语句形式效率比构造函数形式效率高;
  2. function语句形式声明后会占用内存,但是构造函数形式定义函数调用完毕后会从内存中清除;
  3. 用法:如果调用次数多就使用语句式,如果只调用一次就用构造函数式;
    原因:构造函数每new一次就会创建一次函数,而function语句只声明一次;

实例2:效率对比

var d1 = new Date();
var t1 = d1.getTime();
for(var i =0 ; i <100000;i++){
//function test1(){;}
//var test2 = new Function();
}
var d2 = new Date();
var t2 = d2.getTime();
alert(t2 -t1); 
//语句式执行时间11-15毫秒,构造函数式执行时间1-5秒左右

function语句形式优先被js解析器解释:

test1();//打印test1

function test1(){
		alert("test1");
}

alert(test2);//undefined 声明了,但是没有赋值
test2();//报错:test2 is not function
var test2=function(){
	alert("test2");
}

解析顺序案例:

function f(){return 1;} 				// 函数1 	
alert(f());		//返回值为4 说明第1个函数被第4个函数覆盖	
var f = new Function("return 2;");		// 函数2 
alert(f());		//返回值为2 说明第4个函数被第2个函数覆盖
var f = function(){return 3;}			// 函数3 
alert(f());	       //返回值为3 说明第2个函数被第3个函数覆盖	
function f(){return 4;} 				// 函数4 
alert(f());		//返回值为3 说明第4个函数被第3个函数覆盖
var f = new Function("return 5"); 		// 函数5 
alert(f());	//返回值为5 说明第3个函数被第5个函数覆盖	
var f = function(){return 6 ;}			// 函数6 
alert(f());		//返回值为6 说明第5个函数被第6个函数覆盖

//结果:423356 注意:js中没有重载概念,先解释function语句式

函数作用域案例:

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
function test(){return k ;} 
//var test = function(){ return k};
//var test = new Function('return k;');
alert(test());
}
t1();// 输出2

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
var test = function(){ return k};
//var test = new Function('return k;');
alert(test());
}
t1();// 输出2

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
//var test = function(){ return k};
var test = new Function('return k;');
alert(test());
}
t1();// 输出1 由于构造函数式具有顶级作用域关系,所以,找不到局部变量这段代码相当于下面这段代码

var test = new Function('return k;');
var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
//var test = function(){ return k};

alert(test());
}
t1();// 输出1
posted @ 2017-11-24 01:28  极客杰森  阅读(2172)  评论(0编辑  收藏  举报