js(es5)定義函數三種形式筆記
1. 定義函數3種形式:
- function語句形式定義函數
- function直接量定義函數
- 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
三種函數的對比:
三種函數形式效率對比:
- function語句形式效率比構造函數形式效率高;
- function語句形式聲明后會占用內存,但是構造函數形式定義函數調用完畢后會從內存中清除;
- 用法:如果調用次數多就使用語句式,如果只調用一次就用構造函數式;
原因:構造函數每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