//函数
//定义
//函数也是一个对象
//是一个可以重复执行的代码块
//函数就是完成特定功能的一段代码
//采用typeof检查一个函数对象时,会返回function
/*var sum = 0;
for (var i = 0; i <= 100; i++) {
sum += i;
}
console.log(sum);*/
//现在要求求一到用户输入的一个数
/*function getSum(count){
var sum = 0;
for (var i = 1; i <= count; i++) {
sum += i;
}
console.log(sum);
}
getSum(50);
getSum(100);*/
//函数的作用 将反复用的代码封装 需要时调用即可
//特点 一、封装到函数的代码不会立刻执行
// 二、封装到函数的代码只在被调用时执行
// 三、调用函数 语法 函数对象();
// 四、调用函数时,函数中封装的代码会按照顺序执行
//函数的基本使用
// 不常用
/*var fun = new Function("console.log('hello');");
fun();*/
// 常用
// 函数申明方式
/* function sum(a,b){
console.log(a + b);
}
sum(10,20);*/
// 函数表达式申明方式
/* var sum = function(a,b) {
console.log(a + b);
}
sum(10,20);*/
//使用 function构造函数
// var fun = new Function("console.log('hello");
//不推荐使用 主要用于面向对象时理解 函数就是对象,函数名就是指针这个概念
//函数的参数 为了增强函数的 功能性 和 可拓展性,便于交互
//形参 形式上的参数 参与运算的变量 没有实际值 为实参占个位置 像躯壳一样 function f(a,b){} a,b就是形参
//实参 调用函数时真实参与运算的值 sum(10,20); 10,20就是实参
//函数的arguments对象
/*var sum = function(a,b) {
console.log(arguments);
}
sum(10,20);*/
//arguments 其实是一个伪数组对象
//包括 length callee(指针) 指向arguments所在函数
//传递进来的实参 都会传递到arguments伪数组对象中
//所以可以用来判断 传递进来的实参与形参个数是否相等
/*var sum = function(a,b) {
console.log(arguments.length); //输出实参的个数
//比较形参实参个数是否相等
console.log(arguments.length === sum.length);
console.log(arguments.callee);
}
sum(10,20,30,40);
sum(10,20);*/
//arguments.callee的使用 函数涉及到继承 对外是封装的 当调用函数时看调用的到底是哪个函数 parent or son 现在很少用
/*function sum(arr){
var value = 0;
for (var i = 0; i < arr.length; i++) {
value += arr[i];
}
console.log(value);
console.log(arguments);
}
sum([10,15,20]);*/
//我们可以通过arguments这样做 //因为 arguments是一个伪数组
/*function sum(){
var value = 0;
for (var i = 0; i < arguments.length; i++) {
value += arguments[i];
}
console.log(value);
}
sum(10,20,30,40);*/
//函数返回值return
//一个函数被调用时 一般从开始到结尾执行完毕 想提前结束可以用 return语句 return后的将不会再执行
//一般用return返回结果
//注意
//如果函数没有显示的使用 return语句,那么函数有默认的返回值烦恼:undefined
/*function sum(){
}
var s1 = sum();
console.log(s1);*/ //返回值为 undefined
//即为
/*function sum(){
return;
}
var s1 = sum();
console.log(s1); */
//return 后面的值就是返回值
//如果使用了return 但后面没有值 返回值也是undefined
//推荐的做法 让函数始终都返回一个值 要么没有返回值
//请写一个函数 该函数可以判断一个数是不是偶数
/**
* [isEven description]
* @param {number} num [description] 判断一个数是不是偶数
* @return {Boolean} [description]
*/
/* function isEven(num){
if (typeof num !== 'number') {
alert("您的输入有误");
return; //break不适用于函数
}else{
if (num % 2 === 0) {
return '偶数';
}else{
return '奇数'; //可以返回数组 函数 都可以返回
}
}
}
var f1 = isEven(10);
console.log(f1);
*/
//函数直接申明和函数表达式申明的区别
//函数直接声明
/*function func(){
}
//函数表达式声明
var sum =function(){
}*/
//函数申明必须要有函数名
//JS解析器首先会把当前作用域的函数声明提前到整个作用域之前 就是先看函数部分的内容
/*console.log(f1(5,6));
function f1(a,b){
return a + b;
}
console.log(f1(10,11));
//函数表达式声明 会将变量声明提前到最前
//var myFun();会默认放在最前
//……这里有很多代码
// myFun(5,7); //在这里会报错
var myFun = function(a,b){
console.log(a + b) ;
}
myFun(6,6);*/
//所以一个函数经常用 用函数直接声明
//而一个函数不经常用 或者代码庞大 执行效率低 用 函数表达式声明
//匿名函数 没有命名的函数 function (){}
//作用
//用于绑定事件的时候 某些事件调用的时候就可以用到匿名函数
/*document.onclick = function (){
alert(1);
}*/
//用于 定时器 淘宝购物秒杀
/*setInterval(function(){
document.write("我每秒出来一下 <br>");
},1000)
*/
//立即执行函数 闭包 独立空间 只管空间内的 但也有接口可以引进 防止全局变量污染等等作用
/*(function(a,b){
console.log(a + b);
}(10,20))
*/
//函数是一个数据类型
/*function fn(){}
console.log(typeof fn); //返回function 本质上是一个对象
console.log(typeof fn());//返回 undefined
*/
//回调函数 通过函数调用的函数
//如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就称为回调函数
//一般用于递归
/*//加减乘除函数
function add(num1 , num2){return num1 + num2;}
function sub(num1 , num2){return num1 - num2;}
function mul(num1 , num2){return num1 * num2;}
function divide(num1 , num2){return num1 / num2;}
//计算器函数
function cal(num1,num2,func){
return func(num1,num2);
}
var result = cal(10,20,add);
console.log(result);*/