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中的一等公民,特别重要的。本篇文章所讲述的包含,函数分函数声明与函数表达式,立即执行函数分类,函数的参数,函数调用,变量提升,函数提升,局部作用域,全局作用域,闭包与回调函数,包含的知识点比较多,讲解的全面但不深刻。希望能够让您从中学到点知识。
打赏作者通道↓↓↓
如果觉得这篇文章不错的话!点击推荐支持一下哦!!!

浙公网安备 33010602011771号