1. 函数

1.1 函数基础简介

  1. 函数介绍
函数:具有特定功能的代码块
本质:一种对象数据类型
功能:1. 代码复用 2. 项目模块化
函数组成(两者必须同时存在):
1. 函数定义
2. 函数调用
有声明,没调用,函数不会生效;
没声明,有调用。引用类型错误
  1. 函数的定义方式(三种,本质上都是 new Function()

    • 函数声明定义
        function fun1() {
    console.log(11);
    }
    console.log(fun1); //打印结果
    ƒ fun1() {
    console.log(11);
    }
    • 函数表达式定义
        var fun2 = function () {
    console.log(22);
    }
    console.log(fun2); //打印结果
    ƒ () {
    console.log(22);
    }
    函数声明和表达式定义的区别?
    1. 函数声明定义的函数在控制台会带名字
    2. 函数表达式定义的函数在控制台不带名字
    • 构造函数定义
        var fun3 = new Function(
    'console.log("33");'
    );
    console.log(fun3); //打印结果
    ƒ anonymous(
    ) {
    console.log("33");
    }

1.2 函数的三要素

  1. 函数声明三要素
    function fun1(a, b) {
console.log(a, b);
return 0;
} 功能:看函数名字(函数体是真实逻辑)
参数:形参(形式参数)
形参本质:函数内部定义的变量,可以接收外部传递的实参
返回值:1. return后面的值
只写了return;或者没有return,返回值都是undefined
2. return后面的代码不会执行
  1. 函数调用三要素
    fun1(1, 2);

功能:函数调用的名称必须和函数声明的名字一致
参数:实参(实际参数)
实参本质:给函数声明的形参赋值
返回值:函数调用本质是一个表达式,返回值看return的值
  1. 函数调用的特殊情况
1. 实参多于形参,可以调用成功,多的实参不会被赋值
fun1(1, 2, 3); 2. 实参少于形参,可以调用成功,少的实参会自动赋值undefined
fun1(1);

1.3 函数三要素案例

    // 1.
function fn1(a) {
console.log(a);
}
console.log(fn1); //打印函数的定义
console.log(fn1(12)); //执行fn1(12) ,打印fn(12)返回值 undefined // 2.
function fn2(a, b, c) {
console.log(a);
console.log(c);
return;
}
console.log(fn2(1, 2)); //1 undefined undefined // 3.
function fn3(a, b, c) {
console.log(a);
return 45;
console.log(b);
console.log(c);
}
fn3(12, 23, 34); //执行fn3(12,23,34),只会打印a // 4.
function fn4(a, b, c) {
console.log(a);
return b;
}
console.log(fn4(12)); // 12 undefined // 5.
function fn5(b, c) {
console.log(b);
console.log(c);
return 56;
}
console.log(12); //12
console.log(fn5(23, 34)); //23 34 56
console.log(45); //45

1.4 函数的基础案例

1.未知使用参数
2.返回值使用return // 封装函数打印100遍我爱你
// 1.无参数无返回值
function printLove() {
for (var i = 0; i < 100; i++) {
console.log("我爱你");
}
}
printLove(); // 封装函数打印n遍你想要打印的内容
// 2.有参数无返回值
function printContentN(n, content) {
for (var i = 0; i < n; i++) {
console.log(content);
}
}
printContentN(52, 'i love you'); // 封装函数返回2 + 3的和
// 3.无参数有返回值
function sum() {
return 2 + 3;
}
console.log(sum()); // 封装函数返回n + m的和
// 4.有参数有返回值
function sumNM(n, m) {
return n + m;
}
console.log(sumNM(100, 200));

1.5 函数的强化案例

    // 编写函数返回1到n的和
function sum(n) {
var sum = 0;
for (var i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
console.log(sum(100)); // 编写函数返回一个数的阶乘
function factorial(n) {
var total = 1;
for (var i = 1; i <= n; i++) {
total *= i;
}
return total;
}
console.log(factorial(4)); // 编写函数实现返回某个数组的最大值,最小值
// return后面只能返回一个值
function maxAndMin(arr) {
var max = arr[0];
var min = arr[0];
for (var index = 1; index < arr.length; index++) {
if (arr[index] > max) {
max = arr[index];
} if (arr[index] < min) {
min = arr[index];
}
}
//转化成数组返回
return [max, min];
}
console.log('最大值:' + maxAndMin([1, 4, 5, 7, 11, 3, 2])[0]);
console.log('最小值:' + maxAndMin([1, 4, 5, 7, 11, 3, 2])[1]); // 封装函数加工数组,每一项加10输出
function addNum(arr) {
for (var index = 1; index < arr.length; index++) {
console.log(arr[index] + 10);
}
}
addNum([1, 2, 3, 4, 5]); // 封装函数实现打印1到N的质数;
function findPrimeNumber(n) {
var flag = true;
for (var i = 1; i <= n; i++) {
for (var j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag & i != 1) {
console.log(i);
}
flag = true;
}
}
findPrimeNumber(10); // 封装函数返回对数组排序后的结果;
function sort(arr) {
var temp = 0;
// 轮次
for (var i = 0; i < arr.length - 1; i++) {
// 每轮比较次数
for (var j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换位置
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
console.log(sort([5, 3, 11, 45, 1, 22, 0, -11])); // 封装函数返回对数组翻转后的结果
function arrOverturn(arr) {
var temp = 0;
// 折半交换数据
for (var i = 0; i < arr.length / 2; i++) {
temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
return arr;
}
console.log(arrOverturn([1, 3, 5, 7, 9, 100])); // 封装函数返回对数组去重后的结果
function removeRepeat(arr) {
// 使用遍历新数组的方式
var newArr = [];
var flag = true;
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < newArr.length; j++) {
if (arr[i] == newArr[j]) {
flag = false;
break;
}
}
if (flag) {
newArr[newArr.length] = arr[i];
}
flag = true;
}
return newArr;
}
console.log(removeRepeat([1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 11, -11, 0, 5]));

1.6 函数的分类

第一种区分方式
1、js自带 console.log() parseInt() Number()
2、用户自定义 sum() fun() 第二种区分方式
1、无参无返回值
2、有参无返回值
3、无参有返回值
4、有参有返回值 第三种区分方式
1、普通函数 xxx() xxx.yyyy()
2、构造函数 new xxx()

1.7 函数的作用域

作用域:变量的作用范围
作用:隔离变量
ES5范围分类(函数声明为界):
全局作用域(在函数声明外部)
局部作用域(函数声明内部) ☆☆☆一个变量的作用域只与函数声明的位置有关,与函数调用的位置无关! // fn在全局作用域
// c是在局部作用域
var a = 1;
function fn(c) {
var a = 2;
console.log(a);
}
fn();
console.log(a);

1.8 全局变量与局部变量

全局变量:在全局作用域中的变量
局部变量:在局部作用域中的变量
// 第一种
var a = 1;
function fun1() {
var a = 2;
console.log(a, '局部'); //2
}
fun1();
console.log(a, '全局'); //1 // 第二种
var a = 1;
function fun1() {
console.log(a, '局部'); //1
}
fun1();
console.log(a, '全局'); //1 // 第三种
function fun1() {
var a = 2;
console.log(a, '局部'); //2
}
fun1();
console.log(a, '全局');//引用错误,未声明变量a
总结:
1.全局变量和局部变量都存在,各自使用
2.全局变量存在,局部变量不存在,局部可以使用全局变量
3.全局变量存在,局部变量不存在,全局无法使用局部变量
for循环定义的变量也是全局变量
for (var i = 0; i < 5; i++) {
console.log(i);
}
console.log(i); //5

1.9 局部变量不带var的分析

// 局部变量不带var
var a = 10;
var b = 20;
var c = 30;
var d = 40;
function fn() {
var a = 100;
var b = 200;
var c = 300;
var d = 400;
// d = 400;
e = 500;
console.log('局部', a, b, c, d);
console.log('局部', e);
}
fn();
console.log('全局', a, b, c, d);
console.log('全局', e);
局部变量不带var的变量,操作过程:
1.先看函数内部是否声明了这个变量,如果有,这个变量是局部变量
2.如果函数内部没有声明过这个变量,看形参是否有该变量,如果有,该变量就是局部变量
3.如果函数未声明,形参也没有,那么看全局中是否有该变量,如果有,就是在操作全局变量
4.如果全局也没有这个变量,那么会在全局中声明一个变量

(五).JavaScript的函数的更多相关文章

  1. 5种 JavaScript 调用函数的方法

    一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性 ...

  2. JavaScript调用函数的方法

    摘要:这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正 ...

  3. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  4. javascript oop深入学习笔记(二)--javascript的函数

    一.概述: 函数是进行模块化程序设计的基础, javascript重的的函数不同于其他语言,每个函数都作为一个对象被维护和运行.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或则讲函数作为参 ...

  5. Javascript 常用函数【1】

    1:基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript code goes here 3: </script&g ...

  6. JavaScript之函数作用域

    有过类似C语言编程经验的同学应该都知道“块级作用域(block scope)”:花括号内的每一段代码都具有各自的作用域,而且在声明它们的代码段之外是不可见的.而在JavaScript中是没有块级作用域 ...

  7. JavaScript之函数(上)

    在编程语言中,无论是面向过程的C,兼备面过程和对象的c++,还是面向对象的编程语言,如java,.net,php等,函数均扮演着重要的角色.当然,在面向对象编程语言JavaScript中(严格来说,J ...

  8. 【javascript】javascript常用函数大全

    javascript函数一共可分为五类:   •常规函数   •数组函数   •日期函数   •数学函数   •字符串函数   1.常规函数   javascript常规函数包括以下9个函数:   ( ...

  9. javascript的函数、创建对象、封装、属性和方法、继承

    转自原文javascript的函数.创建对象.封装.属性和方法.继承 一,function 从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 如:functi ...

  10. JavaScript中函数函数的定义与变量的声明<基础知识一>

    1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...

随机推荐

  1. 如何理解JavaScript中常用的4种排序算法?

      如何理解JavaScript中常用的4种排序算法? 冒泡排序 冒泡排序是我们在编程算法中,算是比较常用的排序算法之一,在学习阶段,也是最需要接触理解的算法,所以我们放在第一个来学习. 算法介绍: ...

  2. android 打包任务在gradle中

    //打包任务task makexxxxxxJar(type: Jar) { //指定生成的jar名 baseName xxxxxx //从哪里打包class文件 from('build/interme ...

  3. 如何基于ZK实现高可用架构

    zookeeper设计步骤 设计path   节点的路径 选择znode类型 普通节点.临时节点等 设计znode数据 节点中的数据 设计watch 节点的监听事件以及对应的处理 ZK实现主备切换架构 ...

  4. vue 使用 swiper vue-awesome-swiper

    文档地址 https://github.com/surmon-china/vue-awesome-swiper 演示地址 https://v1.github.surmon.me/vue-awesome ...

  5. input点击焦点后阴影

    input[type=text]:focus { outline: none; border-color: rgba(82, 168, 236, 0.8); box-shadow:inset 0 1p ...

  6. 实践:带您用多种姿势将存储在腾讯云COS 上的视频播放

    导语 随着5G时代的到来,短视频/直播行业开始流行,音视频逐渐成为信息传播中流量占比最大的部分.腾讯云对象存储(COS)作为可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务,早已不 ...

  7. Vue.Draggable使用总结

    Draggable为基于Sortable.js的vue组件,用以实现拖拽功能. 特性 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery为基础 和视图模型同步刷新 ...

  8. 2022-04-19内部群每日三题-清辉PMP

    1.一个项目的完工预算(BAC)为100,000美元.目前的项目报告显示该项目符合进度和预算.一位团队成员对相关工作包进行自下而上估算,表明剩余工作将比原计划少用10,000美元,并且仍能按进度计划交 ...

  9. redhat用unbound配置DNS

    redhat配置unbound 1.配置IP地址 2.配置本地yum 3.安装unbound,没有nslookup命令自行安装bind-utlis 4.配置unbound.conf(vi /etc/u ...

  10. leetCode 您正在爬楼梯。它需要n步才能到达顶部。每次您可以爬1或2步。您可以通过几种不同的方式登顶?

    找抄的,不明白!!! public static int climbStairs(int n) { return climb_Stairs(0, n); } public static int cli ...