function 是 js的一等公民

        怀揣激动的心、信心满满的坐上火车去上海,开始了我的海漂生活。然而我在郑州中转的时候接到老爸的电话,大致内容为:“这是媒人给你介绍的女朋友,这是她的联系方式你记得联系啊!这个女孩子170的身高,很美很美的”。当我挂断了老爸的电话,我才意识到我也踏上了相亲的道路。其实心里还很激动的,晚上就给那个女孩打电话,那女孩子问我做什么的。我说做前端的,她说js 里的函数是什么?让我坐着床边慢慢的讲给你听

  •   分类

       函数分为函数表达式与函数声明还有立即执行函数

        函数表达式是:      

1 var fn = function(){
2    
3 }

          函数声明是:

function fun(){
  
}

       立即执行函数:

/*第一种立即执行函数*/
(function(){
    console.log("我是立即执行函数");
})()

/*第二种立即执行函数*/
(function(){
   console.log("我是立即执行函数");
}())

/*立即执行函数传递参数*/

(function(d){
   console.log(d);
}(100))

(function(win){
    console.log(win);
})(window)
  •   参数

     函数可以传递参数,参数可以是对象,可以是变量,可以是函数。函数内还包括arguments。  

function fun (d){
  console.log(arguments);//代表所有参数的集合是数组格式
  console.log(arguments.length);//参数传递的个数
  console.log(arguments.callee);//递归时可以用,但是兼容性不是很好
}
  •   应用

    说到函数不得不提js变量作用域。作用域分局部作用域与全局作用域,局部变量只有在局部访问得到(不包含闭包哦),全局作用域局部函数都可以访问到。

/*全局的d*/
var d=100;
function fun(){
  console.log("我是全局的d:"+d);// 100
}
fun(); /*-------------------------------一条华丽的分隔线--------------------------------*/
/*局部的d*/ var d=100; function fun(){ var d=20; console.log("我是局部的d:"+d);// 20 }
fun();

     函数调用的方法

/*--直接调用--*/
function fun(){
  console.log(1)
}
fun();


/*--方法调用--*/
var obj={
    option:{
        s:100
    },
    fn:function(){
     console.log(this.option.s);
   }
};
obj.fn();

/*--构造函数调用--*/
var Dom=function(){
   this.age=function(){
       console.log(this.vision);
  };
  this.vision='1.0.1';
};
var d=new Dom;
d.age();

/*--call 与 apply调用--*/

var d={
   a:10,
   b:100
};
function s(){
   console.log(this.a);
}

s.call(d);

 

    说到作用域不得不说变量提升

/*变量提升*/
var d=100;//全局变量
function fun(){
  console.log(d);
  var d=20;//局部变量
  console.log(d);
}
 fun();

//如果是一个对js了解的比较深刻一点的,是会知道答案的。

打印出来的是:
undefined
20

说到变量提升不得不说的函数提升

/*函数提升---这个我们很常用*/
fun(10,20);//在这里是可以调用的

/*计算两个数值的和*/
function fun(a,b){
  raturn a+b;
}

fun(10,20);//在这里     是可以调用的

说到函数提升不得不说说函数提升与变量提升的优先级

 1 /*函数提升与变量提升的优先级*/
 2 
 3 function fun(){
 4      console.log(d);
 5      var d=10;
 6      console.log(d);
 7      function d(){
 8 
 9      }
10 }
11 
12 答案:
13 function d(){
14 
15      }
16 10
17 
18 /*--------------------------华丽的分割线---答案是啥啊!!-----------------------*/
19 /*看一下这个*/
20 function fun(){
21      console.log(d);
22      function d(){
23 
24      }
25      console.log(d);
26      var d=10;
27 }
28 
29 
30 答案:
31 function d(){
32 
33      }
34 function d(){
35 
36      }

函数声明与函数表达式的区别

1 /*函数表达式--执行必须在函数表达式后面*/
2 
3 
4 fun();//在这里是           可以执行的。
//因为函数表达式可以拆分成定义变量,只不过把一个函数的引用赋值给一个变量,因为变量会提升,
//在这里调用时候,fun是undefined;fun还没有被赋值就被调用了。所有会报错:fun is not a function
5 6 var fun=function(){ 7 console.log(1); 8 } 9 fun();//在这里是可以执行的。

函数被誉为js中一等公民,就这么多吗?  我的回答肯定是:NO。

讲一下 回调函数

 1 function domes(fn){
 2        var n=200;
 3        setTimeout(function(){
 4              fn();//fn就是回调函数(每个人的理解是不同的,有人认为有的回调函数也是闭包)
 5        },2000)
 6 }
 7  (function(){
 8     var n=100;
 9     domes(function(){
10     console.log(n);
11    })
12 }())
13 /*-----------一条华丽的分割线-------------------*/
14 答案:
15 2秒后打印出  100
16 
17 这是为什么呢?
18 答:
19 domes函数 把一个匿名函数当参数传递过去了,
20 这时候,domes中的fn就指向了这个匿名函数的引用,
21 当这个匿名函数执行的时候,这个匿名函数打印n它就会在本身这个匿名函数查找,
22 找不到以后,就去上层函数找,就发现 n=100;

什么是闭包呢!闭包是一个有争议的话题,不过呢!闭包的含义还是很清晰的,借用小小沧海一句话:广义上的闭包就是指一个变量在他自身作用域外被使用了,就叫发生了闭包

 1 /*--常见的闭包--*/
 2 function fun(){
 3    var d=100;
 4    return function (){
 5       console.log(d++);
 6   }
 7 }
 8 var s=fun();
 9 s();//打印出100
10 s();//打印出101
11 /*---------------------一条华丽的分割线-----------------*/
12 解释:
13 1.任何一个函数都有返回值的,如果没有用 return 返回。默认返回 undefined。
14 2.当执行fun();时候 return 返回出来一个匿名函数 , 把这个匿名函数赋值给s。s保存了这个匿名函数的引用。
15 3.当执行这个s()的时候就是执行了这个匿名函数,即:打印出来100
16 4.打印过之后d++,修改了d的值
17 5.再次执行s();打印出来101
18 
19 /*另一种闭包--无return的*/
20 
21 var don;
22 function fun(){
23     var b=100;
24     don=function(){
25      console.log(b++);
26   }
27 }
28 fun();
29 don();//输出100;
30 don();//输出101;
31 /*---------------------一条华丽的分割线-----------------*/
32 解释:
33 1.定义一个全局变量。
34 2.执行fun();把匿名函数的地址引用赋值给全局变量
35 3.现在执行don就可以访问到b的值
36 
37 /*还有上边讲到的回调函数有的也是闭包哦*/

总结:

     函数是js中的一等公民,特别重要的。本篇文章所讲述的包含,函数分函数声明与函数表达式,立即执行函数分类,函数的参数,函数调用,变量提升,函数提升,局部作用域,全局作用域,闭包与回调函数,包含的知识点比较多,讲解的全面但不深刻。希望能够让您从中学到点知识。

 

posted @ 2017-06-28 17:45  小小坤  阅读(1192)  评论(0)    收藏  举报