一】、定义:
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()方法