一、前言  

  昨天我们了解了Js的很重要的一个概念叫做函数,函数就是对于冗余和垃圾代码的一种封装机制。简单的讲就是为了能让程序更好更快的执行我们将一些重复性的代码提取,封装成一个有名字的小盒子,等到我们需要的时候我们可以直接将盒子拿出来使用。

二、引入

  无论是在前端还是后台语言中函数都是一个个成功程序的最小封装模块,就像搭积木一样你需要不同的种的模块来组成一个成品。那么对于函数来说每一个就应该有它自己的特性以。

三、重点内容

  ㈠  函数的四种形式

    ① 有参数,无返回值(一般没有返回值的时候默认的返回值都是undefined)

  1. function fun(a,b){
  2. console.log(a+b);
  3. }

    ② 无参数,无返回值(一般用于有代码复用或者功能性代码段)

  1. function fun(){
  2. console.log("Hello World");
  3. }

    ③ 有参数,有返回值(推荐函数可以这么写)

  1. function fun(a,b){
  2. return a+b;
  3. }

    ④ 无参数,有返回值

    

  1. function fun(a,b){
  2. console.log(a+b);
  3. }
  ㈡ 函数的重载

  

    与后台语言不同,JS的函数中是没有函数重载的。说到重载我们就要稍微了解一下重载是什么意思了。

    重载:即函数的命名相同,但是函数的形参个数或者数据类型的不同就会引起不同。简单的说就是在点名的时候有两个一模一样的名字,但是体型确实一胖一瘦。这两个人都是这个班的同学所以都是存在的。

    在Js当中就没有重载这一个感念,那么很多人会问,如果如果我在工作的命名不小心相同了怎么办,那么请看下面的这段代码

  1. function fun(a,b){
  2. return a+b;
  3. }
  4. function fun(a,b,c){
  5. a = a||0;
  6. b = b||0;
  7. c = c||0;
  8. return a+b+c;
  9. }
  10. console.log(fun(1,2));

    我相信很多人去测试这段代码的时候输出的结果是3所以认为我上面说错了。但其实不然如果我们打开测试着工具的一步步调试的时候会发现,函数调用的时候是调用的参数3个函数。那么为什么又会等于3呢?因为我在这里面添加了短路运算来避免错误的出现。(不懂短路运算的请翻看Js第3天内容)。在Js中是没有重载的,像上面一样的定义第一次定义的就会被后面的所覆盖。

  ㈢ 选择结构

    作用域:即变量所作用的区域; 

      1) 全局作用域:全局作用域的变量就是全局变量。即在整个页面的任何位置都可以访问到到。(注意:在函数中不使用var定义的变量也是全局变量)。

      2) 局部作用域:局部作用域的变量就是局部变量。只在函数中可以访问的。

  ㈣ 匿名函数与函数表达式方式

     在昨天的介绍中我们知道了函数定义的方式是function函数名([参数列表]){函数体};其实还有一中定义的方式就是利用函数表达式命名

  1. var fun = function(){
  2. return 0;
  3. }

    这种方式类似于变量的定义,而其后面的函数没有名字就被称作匿名函数。它前面的变量名就可以看做是函数名。

    

    函数表表达式方式和函数命名方式的区别:

    1. 函数的声明中的函数有名字
    2. 函数表达式中的函数没有名字,是匿名函数,前面的变量的名字可以看做是函数的名字
    3. 在函数预解析的时候,会先将函数声明提前到作用域的最前面,而函数表达式不会提升
    4. 函数声明中的函数,可以在声明之前调用,但是函数表达式的函数必须在函数表达式之后调用
  ㈤ 函数的预解析

    在程序真正执行之前,会将所有的代码扫描一遍,将变量的声明,参数提升到当前作用域的最前面。

  1. function fun(a,b){
  2. console.log(c);
  3. console.log(a);
  4. console.log(b);
  5. var c = 100;
  6. }
  7. fun(1,2);

    在当前代码中console.log(c)会打印什么值呢,我想很多人跟我开始的想法一样,因为在下面定义了局部变量c为100,所以输出的时候应该是100.但其实我们都错了,因为函数要做预解析,所以会把变量的声明提到当前作用域的最前面如下所示:

  1. function fun(a,b){
  2. var c;
  3. console.log(c);
  4. console.log(a);
  5. console.log(b);
  6. c = 100;
  7. }
  8. fun(1,2);

    所以c是不会有值得,因为它只有声明没有赋值所以返回的是undefined。

  ㈥ 自执行函数    
  1. var fun = function(){
  2. console.log("你好")
  3. };
  4.  
  5. fun();
  6. (function(){
  7. console.log("你好");
  8.  
  9. }());
  10.  
  11. (function(){
  12. console.log("你好");
  13.  
  14. })();

    因为我们利用了函数表达式的方式定义函数,所以当调用的时候我们可以把小括号前面的部分用赋值符号右面的部分代替,再将代替的部分用小括号括起来这样就形成了自执行函数。

    特点:自执行函数是没有名字的,定以后马上调用。多用于一次性使用中。

  ㈦ 回调函数
  1. var fun = function(a,b,ff){
  2. return ff(a,b);
  3. }
  4. console.log(fun(10,20,function(a,b){return a+b ;}))

    

    是不是看蒙了,那我们稍微分解一下

  1. function fn(a,b){
  2. return a+b;
  3. }
  4. var fun = function(a,b,ff){
  5. return ff(a,b);
  6. }
  7. console.log(fun(10,20,fn));

    其实回调函数的本质就是把函数当做参数来传递。

四、总结

    对于函数还是需要多加练习才可以绕明白,我觉得其中最终的一点就是一定要记住每个函数都是有返回值的,有时可能会打印但有时也不会打印。你需要多多的自己判断。

JavaScript 基础第四天的更多相关文章

  1. 前端开发之JavaScript基础篇四

    主要内容: 1.定时器 2.正则表达式入门 3.元字符 4.正则表达式实战运用 一.定时器 javaScript里主要使用两种定时器,分别是:setInterval()和setTimeout(). 1 ...

  2. javascript基础(四)语句

    原文http://pij.robinqu.me/ for/in语句也使用for关键字,但它是和常规的for循环完全不同的一类循环.语法: for (variable in object) statem ...

  3. JavaScript基础学习(四)—Object

    一.Object的基本操作 1.对象的创建      在JavaScript中,创建对象的方式有两种:构造函数和对象字面量.      (1)构造函数 var person = new Object( ...

  4. JavaScript基础(四)

    十六.client.offset.scroll系列 1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta ...

  5. 回归JavaScript基础(四)

    主题:JavaScript变量.作用域和内存问题 JavaScript的变量和别的语言比起来是与众不同的.说道变量,不得不谈他的作用域.同很多语言一样,JavaScript开发者也不用担心开发中内存的 ...

  6. javascript基础拾遗(四)

    1.什么是闭包 正常函数,执行完毕后相关的参数,变量就释放掉了. 当一个函数的返回值是另一个函数时,该函数的相关参数和变量都会保存在返回的函数中,这种结构叫做闭包. 2.示例 计算数组和 functi ...

  7. javascript基础(四): 操作表单

    表单是什么?form-----DOM树 文本框----text 下拉框----select 单选框----radio 多选框----checkbox 隐藏域----hidden 密码框----pass ...

  8. JavaScript 基础 学习 (四)

    JavaScript 基础 学习 (四) 解绑事件 dom级 事件解绑 ​ 元素.on事件类型 = null ​ 因为赋值的关系,所以给事件赋值为 null 的时候 ​ 事件触发的时候,就没有事件处理 ...

  9. JavaScript基础四

    1.13 Js中的面向对象 1.13.1 创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或 ...

随机推荐

  1. 逐个访问URL的每个查询字符串参数

    下面介绍一个函数,用于处理location.search的结果,以解析查询字符串,然后返回包含所有参数的一个对象. 比如  www.baidu.com?q=javascript&num=10 ...

  2. Windows 10通过本地镜像离线安装.NET 3.5

    在Windows10中,当我们安装某些软件的时候会提示"你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)",由于 ...

  3. NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本

    作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:自己的程序在windows xp环境下编译,在windows 2003, windows 7,windows 8是否需要提权或者兼容处理, ...

  4. Source Insight 3.X utf8支持插件更新

    [更新内容] 修复了当UTF8文件外部改变时,SI无法检测到的bug. 实现 [下载地址] 点我 [计划] 未来(无限长)优化utf8编码检测规则,提高准确度.

  5. iOS随机页面NSClassFromString

      NSString *className = self.classNameArray[randomNumber]; Class viewClass = NSClassFromString(class ...

  6. SQL Server 集合处理

    UNION ALL 返回两个结果集中所有的行,返回结果集中会存在重复行 UNION 返回两个结果集中去重的行,返回结果集中无重复行 INTERSECT 返回两个结果集都有的行,返回结果集中无重复行 E ...

  7. listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.

    1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...

  8. poj1014(还需要改动)

    #include <stdio.h> int n[6]; int main() { freopen("in.txt","r",stdin); int ...

  9. Java多线程开发技巧

    很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...

  10. mysql galera cluster 集群的分裂与仲裁机制

    集群的分裂 当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致.这种情况 下,只有一组节点能够继续提供服务,这组节点的状态 ...