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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM