JavasSript 基础第四天

一、前言  

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

二、引入

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

三、重点内容

  ㈠  函数的四种形式

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

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

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

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

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

function fun(a,b){
    return a+b;
}

    ④ 无参数,有返回值

    

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

  

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

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

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

function fun(a,b){
    return a+b;
}
function fun(a,b,c){
    a = a||0;
    b = b||0;
    c = c||0;
    return a+b+c;
}
console.log(fun(1,2));

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

  ㈢ 选择结构

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

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

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

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

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

var fun = function(){
    return 0;
}

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

    

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

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

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

function fun(a,b){
    console.log(c);
    console.log(a);
    console.log(b);
    var c = 100;
}
fun(1,2);

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

function fun(a,b){
    var c;
    console.log(c);
    console.log(a);
    console.log(b);
    c = 100;
}
fun(1,2);

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

  ㈥ 自执行函数    
var fun = function(){
    console.log("你好")
};

fun();
(function(){
console.log("你好");

}());

(function(){
    console.log("你好");

})();

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

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

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

    

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

 function fn(a,b){
        return a+b;
    }
    var fun = function(a,b,ff){
    return ff(a,b);
}
    console.log(fun(10,20,fn));

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

四、总结

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

时间: 2024-10-19 13:17:11

JavasSript 基础第四天的相关文章

数字视频基础(四)

3. 常用视频处理算法 3.1 图像的缩放 所谓图像缩放就是创立新的像素位置并对这些新位置赋灰度值.比如,有一副大小为500x500像素的图像,想把它放大1.5倍,也即750x750像素,概念上看,一种最容易的形象化放大方法就是在原始图像上,放一个虚构的750x750的栅格.很显然栅格的间隔小于1个像素,因为,我们在一个较小的图像上去拟合它.为了对覆盖层上的任何电进行灰度赋值,我们在原图像上寻找最靠近的像素并把它的灰度付给栅格上的新像素.当对覆盖栅格的全部点都赋完值之后,就得到放大的图像.这种灰

面向对象基础(四)

1. 函数的重载 2. 构造函数的作用 1. 函数的重载 Chongzai.java class Chongzai{     void funA(){         System.out.println("没有参数的funA函数");     }     void funA(int i){        System.out.println("拥有整形参数的funA函数");     } } Test.java public class Test{    publ

linux基础命令作业四

linux基础命令四 作业一: 1)              开启Linux系统前添加一块大小为15G的SCSI硬盘 2)              开启系统,右击桌面,打开终端 3)              为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区, 在扩展分区上划分1个逻辑分区,大小为5G 4)              格式化主分区为ext3系统 5)              将逻辑分区设置为交换分区 6)              启用上一步的交换分区 7)   

Java Script基础(四) BOM模型

Java Script基础(四) BOM模型 一.BOM模型 BOM模型(Browser Object Model),也称为浏览器对象模型,它包含浏览器相关的属性和方法,例如操作,前进后退按钮,控制地址栏,关闭浏览器窗口,打开新窗口等等.它包含的对象主要有一下几种. 1.Window对象 Window对象时指整个窗口对象,可以通过操作Window对象的属性和方法控制窗口,例如打开和关闭一个窗口. Window常用的属性和方法查询: 2.History对象 History指浏览器访问过得历史记录,

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

C# 基础知识 (四).C#简介及托管代码

        暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了很多东西,也学到了很多东西,也认识到了很多不足之处!闲暇之余我准备重新进一步巩固C#相关知识,包括C#入门知识.C#并行开发.ASP网站等.这篇文章我介绍的是书籍--C#入门经典(Beginning C#) 作者Karli Watson.主要包括的是我自己缺乏的一些C#简介知识和托管代码的内容.内容比较简单,参照该书籍较多,相当于自己的在线笔记!                             

第五天:语言基础(四)

Java 中的运算符 一门编程语言,最常坐的工作就是数据运算.在 Java 中,有丰富的运算符来进行数值运算.这些运算符可以分为以下几类: 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其它运算符 算数运算符 先来说说算数运算符. 操作符 描述 说明 + 加--运算符两侧的值进行相加 注意类型转换 - 减--左操作数减去右操作数 注意类型转换 * 乘--运算符两侧的值进行相乘 注意类型转换 / 除--左操作数除以右操作数 注意左右操作数类型的不同,结果的类型也不同 % 取余--左操作

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

Python 基础语法(四)

Python 基础语法(四) --------------------------------------------接 Python 基础语法(三)-------------------------------------------- 十.Python标准库 Python标准库是随Pthon附带安装的,包含了大量极其有用的模块. 1. sys模块 sys模块包含系统对应的功能 sys.argv ---包含命令行参数,第一个参数是py的文件名 sys.platform ---返回平台类型 sy