11_函数(【二】三种定义方式)

三种定义函数的方式:
    function语句形式
    函数直接量形式
    通过Function构造函数形式定义函数

//三种方式定义函数

//1 function语句式
function test1(){
    console.info("我是test1");
}
test1();

//2 函数的直接量 ECMAScript
var test2 = function(){
    console.info("我是test2");
}
test2();

//3 function构造函数式,基本不使用
var test3 = new Function("a", "b", "return a + b;");
console.info(test3(10, 20));

比较三种方式定义的区别:
    效率对比

//效率对比
//function语句式比构造函数式效率要高很多
var d1 = new Date();
var t1 = d1.getTime();

for(var i=0; i<1000; i++){
    /*
    function fn(){
    } 
    */
    /* new Function("a", "b", "return a + b;"); */
}

var d2 = new Date();
var t2 = d2.getTime();
console.info(t2 - t1);

    解析顺序

//解析顺序 对于function语句式的函数javascript会预编译
fn1();
function fn1(){
    console.info("我会预编译");
}

//fn2(); //此处会报错  TypeError: fn2 is not a function
console.info(fn2); // undefined表示fn2声明了,但是没有初始化

var fn2 = function(){
    console.info("我不会预编译");
};

function f(){ return 1; } //函数1
console.info(f()); //返回值为4;第一个函数被第四个函数覆盖
var f = new Function("return 2;"); //函数2
console.info(f()); //返回值为2;第四个函数被第二个函数覆盖
var f = function(){ return 3; } //函数3
console.info(f()); //返回值为3;第二个函数被第三个函数覆盖
function f(){ return 4; } //函数4
console.info(f()); //返回3;第四个函数被第三个函数“覆盖”
var f = new Function("return 5;"); //函数5
console.info(f()); //返回值5;第三个函数被第五个函数覆盖
var f = function(){ return 6;} //函数6
console.info(f()); //返回值6;第五个函数被第六个函数覆盖

    函数作用域

//函数作用域的概念
var k = 1;
function testscope1(){
    var k = 2;
    function test(){ return k; } //function语句式 私有作用域,返回值2
    console.info(test());
}

function testscope2(){
    var k = 2;
    var test = function(){ return k; } //函数直接量式 私有作用域,返回2
    console.info(test());
}

function testscope3(){
    var k = 2;
    var test = new Function("return k;"); //构造函数式 顶级作用域,返回1
    console.info(test());
}

testscope1();
testscope2();
testscope3();

你可能感兴趣的:(函数的定义方式)