(九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]

一】、定义:

 1 /**
 2  * 函数表达式
 3  *
 4  * Function() 构造函数
 5  *
 6  * 函数提升(Hoisting)
 7  * JavaScript默认将当前作用域提升到前面去
 8  * Hoisting应用在变量的声明和函数的声明
 9  * 【使用表达式定义函数时无法提升】
10  *
11  * 自调用函数
12  *
13  * 函数是对象*/
 1 //函数表达式储存在变量中
 2 var x = function () { return 'message'; };
 3 
 4 console.log(x());
 5 
 6 /**
 7  以上函数实际上是一个 匿名函数 (函数没有名称)。
 8  函数存储在变量中,不需要函数名称,通常通过变量名来调用。
 9  上述函数以分号结尾,因为它是一个执行语句。
10  */
1 //不建议。在 JavaScript 中,很多时候,你需要避免使用 new 关键字。
2 var myFunction = new Function('a', 'b', 'return a*b');
3 console.log(myFunction(3, 4));
1 //函数提升
2 //在函数声明之前调用
3 myFunction();
4 
5 function myFunction() {
6     console.log(233);
7 }
1 //自调用函数,是一个表达式,有括号把表达式括起来
2 (function () {
3     console.log('Hello'); //我将调用我自己
4 })();
 1 //函数是对象,函数有属性和方法
 2 console.log(typeof(function add() {})); //function
 3 
 4 //arguments.length 属性返回函数调用过程接收到的参数个数
 5 //arguments是JavaScript的内置对象
 6 function myFunction(a, b){
 7     console.log(arguments.length);
 8 }
 9 
10 myFunction(1, 2); //2
11 myFunction(); //0
12 myFunction('test'); //1
13 
14 //总结:
15 //函数定义作为对象的属性,称之为对象方法。
16 //函数如果用于创建新的对象,称之为对象的构造函数。

 二】、参数

 1 /**
 2  * 函数参数
 3  *
 4  * arguments 对象
 5  * arguments对象包含了函数调用的参数数组
 6  * */
 7 
 8 /**
 9  * 如果函数在调用时缺少参数,参数会默认设置为: undefined
10  有时这是可以接受的,但是建议最好为参数设置一个默认值*/
function add(x, y){
    if(y === undefined) {
        y = 0;
    }
    //或者:
    //y = y || 0;
    //如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。
    console.log( x + y);
}

add(2);
console.log(Boolean(undefined)); //false
 1 //查找最后一个参数的值
 2 function findMax() {
 3     var maxNum = 0;
 4 
 5     for(var i = 0;i < arguments.length;i++) {
 6         if(arguments[i] > maxNum) {
 7             maxNum = arguments[i];
 8         }
 9     }
10     console.log(maxNum);
11 }
12 findMax(4,5,6); //6
1 function sumAll() {
2     var sum = 0;
3 
4     for(var i = 0;i < arguments.length;i++) {
5         sum += arguments[i];
6     }
7     console.log(sum);
8 }
9 sumAll(4,5,6); //15

 三】、调用

 1 /**
 2  * 函数的调用:
 3  *
 4  * 1.作为一个函数调用
 5  *
 6  * 2.作为对象的方法调用
 7  *
 8  * 3.构造函数new调用函数
 9  *
10  * 4.call()、apply()调用函数
11  * call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
12  * call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
13  如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 */
14 
15 
16 var myObject = {
17     myName: 'lqc',
18     myPets: ['HuaDou', 'ErBao'],
19     fullInformation: function () {
20         return this.myName + ' have ' + this.myPets[1];
21     }
22 };
23 
24 console.log(myObject.fullInformation());
25 
26 function multiply(a, b) {
27     return a*b;
28 }
29 
30 console.log(multiply.call(myObject, 5, 6));
31 console.log(multiply.apply(myObject, [5, 6]));

四】、闭包

闭包:
私有变量可以用到闭包

 1 // 计数菌
 2 var add = (function (){
 3     var counter = 0;
 4 
 5     return function () {
 6         return counter++;
 7     };
 8 
 9 })();
10 
11 console.log(add());
12 console.log(add());
13 console.log(add());
 1 //定义多个嵌套函数
 2 function counter() {
 3     var counter = 0;
 4 
 5     return {
 6         count: function () {
 7             return counter++;
 8         },
 9         reset: function () {
10             return counter = 0;
11         }
12     };
13 }
14 
15 var c1 = counter();
16 var c2 = counter();
17 
18 console.log(c1.count());
19 console.log(c1.count());
20 console.log(c1.count());
21 
22 console.log(c2.count());
23 console.log(c2.count());
24 console.log(c2.reset());

五】、call()方法和apply()方法

参考:http://www.cnblogs.com/lqcdsns/p/5349496.html

原文地址:https://www.cnblogs.com/lqcdsns/p/5351184.html