【Javascript】循环,函数,调用栈,闭包,递归

news2024/11/18 7:52:09

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 函数
    • 作用域
    • 例子
  • 调用栈
  • 可选参数
  • 闭包
  • 递归

函数

  • 形参不需要定义var,函数可以付给一个变量
  • 函数就可以看作一个值,值就要用变量来指向。
  • function在一行的开头时,表达的是函数声明语句,而不是表达式,所以没有求值结果
  • 使用函数声明形式创建的函数function(){ } 它会在所有的代码执行之前就被创建,所以我们在可以函数声明前调用函数,使用函数表达式创建函数不会被声明提前。
  • var的定义也可以实现提前,下面的打印的a是undefined,下面这个会将a的定义提前,但是赋值还是在原来的位置
  • 下面就出现了let变量,let变量在定义前是不能被使用的,定义前的这部分区域也就叫做TDZ(temper dead zone暂时性死区),并且let定义的变量不能重复定义,第三let可以解决闭包问题。
  • 1.let定义的变量在块级作用域内,var是在函数作用域2.let定义的变量不能重复定义(在控制台两次粘贴可以)3.let定义的变量没有将定义提升,但有TDZ行为,即该作用域内定义完成之前不能使用该变量
    在这里插入图片描述

在这里插入图片描述

作用域

  • 函数中的变量每次调用都会重新创建,定义在任意函数之外的变量称为全局变量(全局作用域),如果在函数中没有用var定义变量,并且全局变量中有一个x,那么就是使用的全局变量的x。
  • 定义在函数中的变量叫做局部作用域
  • 函数还可以在其他函数中定义,这样就会产生多层次的局部作用域

全局作用域自动存在
其他作用域都是通过函数的运行产生的
函数不运行,是不会产生作用域的
函数运行多次,会产生多个作用域
函数运行完后,作用域往往会销毁掉(闭包)

例子

<script>
  //接受一个n,判断它是否是素数
  var isPrime = function (n) {
    for (var i = 2; i <= Math.sqrt(n); i++) {
      if (n % i == 0) {
        return false
      }
    }
    return true
  }
</script>

<script>
  //判断十进制数字的位数
  debugger
  var digitWidth = function (n) {
    var c = 0
    do {
      var digit = n % 10
      c++
      n = (n - digit) / 10
    } while (n > 0)
    return c
  }
  console.log(digitWidth(10))
</script>

<script>
  var chessBoard = function (size) {
    var a = ''
    var b = ''
    for (var i = 0; i < size; i++) {
      if (i % 2) {
        a += ' '
        b += '#'
      } else {
        a += '#'
        b += ' '
      }
    }
    var result = ''
    for (var i = 0; i < size; i++) {
      if (i % 2) {
        result += a
      } else {
        result += b
      }
      result += '\n'
    }
    return result
  }
  console.log(chessBoard(8))
</script>

  • 这道题注意if括号里的顺序问题
<script>
  var fizzBuzz = function (n) {
    for (var i = 1; i < n; i++) {
      if (i % 3 == 0 && i % 5 == 0) {
        console.log('fizz buzz')
      } else if (i % 5 == 0) {
        console.log('buzz')
      } else if (i % 3 == 0) {
        console.log('fizz')
      } else {
        console.log(i)
      }
    }
  }
</script>
<script>
  //求一个正数的平方根(二分法)
  function sqrt(n) {
    var l = 0
    var r = n
    while (r - l > 0.000001) {
      var m = (l + r) / 2
      if (m * m == n) {
        return m
      } else if (m * m < n) {
        l = m
      } else if (m * m > n) {
        r = m
      }
    }
    return (l + r) / 2
  }
</script>

<script>
  //判断一个数是不是水仙花数
  function digitWidth(n) {
    var width = 0
    do {
      var digit = n % 10
      n = (n - digit) / 10
      width++
    } while (n > 0)
    return width
  }
  function power(x, n) {
    var exp = 1
    for (var i = 0; i < n; i++) {
      exp *= x
    }
    return exp
  }
  function isNarcissistic(n) {
    var width = digitWidth(n)
    var m = n
    var sum = 0

    do {
      var digit = m % 10
      sum += power(digit, width)
      m = (m - digit) / 10
    } while (m > 0)

    if (sum == n) {
      return true
    } else {
      return false
    }
  }

  for (var i = 1; i < 10000; i++) {
    if (isNarcissistic(i)) {
      console.log(i)
    }
  }
</script>

<script>
  //判断一个数是否是回文数字
  function isPalindrow(n) {
    var m = n
    var revert = 0
    while (m > 0) {
      var digit = m % 10
      revert = revert * 10 + digit
      m = (m - digit) / 10
    }
    if (revert == n) {
      return true
    } else {
      return false
    }
  }
</script>

<script>
  //判断一个数是否是完全数(一个数等于因式之和)
  function isCompleteNumber(n) {
    var sum = 1
    for (var i = 2; i <= Math.sqrt(n); i++) {
      if (n % i == 0) {
        var j = n / i
        if (i == j) {
          sum += i
        } else {
          sum += i + j
        }
      }
    }
    return n == sum
  }
</script>

调用栈

  • 栈是后进先出
  • 调用栈的两个语义:1.计算机内部用于存储函数返回位置,函数的局部变量的内存空间,叫做调用栈。2.函数间的相互调用的等待关系,叫调用栈

可选参数

  • 如果函数参数少写了一个实参,那么那个实参就式undefined类型,浏览器就自动补全另一个参数
<script>
  function a() {
    console.log(arguments[0], arguments[5])
  }
  a(1, 2, 3, 4, 5, 6, 7, 8, 9)
</script>

  • 通过arguments可以取出函数参数的值,arguments就看作一个数组即可
  • js还可以设置参数的默认值,这样在调用函数的时候可以使用默认参数
<script>
  function power(a, n = 2) {
    var result = 1
    for (var i = 1; i <= n; i++) {
      result *= a
    }
    return result
  }

  console.log(power(3))
</script>

闭包

  • 一直没有销毁的作用域我们就叫做闭包,在js中返回一个函数,函数内用到了外层函数的变量,所以内层函数在,外层函数的变量就在,这样作用域就不会被销毁,形成了闭包
<script>
  debugger
  function wrapValue(n) {
    var localVariable = n;
    function get(){
      return localVariable
    }
    return get
  }

  var wrap1 = wrapValue(1)
  var wrap2 = wrapValue(2)
  console.log(wrap1())
  console.log(wrap2())
</script>

递归

  • 结束条件,在该条件中,不递归
  • 调用自己的时候认为自己已经被正确实现了,问题的更小规模可以直接调用自己求解
  • 调用自身的时候一定要传入更小规模的参数/或者是更接近非递归条件的参数
<script>
  //输入n个数并倒叙输出:输入1个数a;输入n-1个数并倒叙输出;输出a
  function inputAndReverseOutput(n){
    if(n == 0){
      return
    }
    var a = prompt()
    inputAndReverseOutput(n-1)
    console.log(a)
  }
</script>

<script>
  //斐波那契额数列
  function fibonacci(n) {
    if (n == 1 || n == 2) {
      return 1
    } else {
      return fibonacci(n - 1) + fibonacci(n - 2)
    }
  }
  var n = Number(prompt())
  for (var i = 1; i <= n; i++) {
    console.log(fibonacci(i))
  }
</script>

<script>
  //汉诺塔,将放置于start位的顶部的n个盘移动到end位
  function hanoi(n, start, end) {
    if (n == 1) {
      console.log(start, '->', end)
      return
    }
    var mid = 6 - start - end//计算出中转位的编号
    hanoi(n - 1, start, mid)//将摆放在起点位置顶部的n-1个盘移到中转位上
    console.log(start, '->', end)//将摆放在起点位置唯一的一个盘移到终点位上
    haooi(n - 1, mid, end)//将摆放在中转位顶部的n-1个盘移到终点位上
  }
</script>

———————————————— ————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Qcom USB Driver学习(八)

该系列文章总目录链接与各部分简介&#xff1a; Android Qcom USB Driver学习(零) 因为要看usb charging的问题&#xff0c;所以需要补充一下battery的相关知识&#xff0c;算是入门吧 BAT SCH (1)VBATT_VSNS_P (2)BAT_THERM (3)I2C_SDA (4)I2C_SCL (5)VBATT_VSNS_M (1)BATT…

【问题分析】解决java中epoll依赖缺失问题

【问题分析】解决java中epoll依赖缺失问题一、前言二、问题描述三、问题分析四、解决方法五、总结一、前言 在学习使用lettuce框架实现UNIX域套接字unix domain socket连接redis时&#xff0c;遇到了一个问题&#xff0c;提示java.lang.IllegalStateException: A unix domain …

Java Stream后续来了,汇总一些项目开发中高频使用的 Stream操作

不过讲解这些操作时用的都是非常简单的例子&#xff0c;流操作的数据也都是简单类型的&#xff0c;主要的目的是让大家能更快速地理解 Stream 的各种操作应用在数据上后&#xff0c;都有什么效果。 在现实场景中实际做项目的时候&#xff0c;我们使用Stream操作的数据大多数情…

OpenCV颜色识别

颜色分辨 单个颜色识别 代码 import cv2 import numpy as npdef color(lower, upper, name):Img cv2.imread(image/origin/all.png) # 读入一幅图像kernel_3 np.ones((3, 3), np.uint8) # 3x3的卷积核if Img is not None: # 判断图片是否读入HSV cv2.cvtColor(Img, cv2…

maven中profiles使用详解,多环境开发配置文件(开发,测试,生产)+ pom中resources部分标签介绍

一.maven中profiles使用详解&#xff08;仅供参考&#xff09; 使用的场景 常常遇到一些项目中多环境切换的问题。比如在开发过程中用到开发环境&#xff0c;在测试中使用测试环境&#xff0c;在生产中用生产环境的情况。springboot中提供了 spring.profile.active的方式来实…

以mariadb为例介绍如何使用systemctl命令集设置服务开机自启动

以mariadb为例介绍如何使用systemctl命令集设置服务开机自启动一、systemd简介二、systemctl命令集常用命令三、以mariadb自启动为例四、更多说明一、systemd简介 systemd即为system daemon,是linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许…

[思维模式-13]:《复盘》-1- “知”篇 - 认识复盘

目录 前言 一、什么是复盘 二、复盘的三个关键词 三、复盘&#xff0c;而非总结 四、复盘的优势与局限 五、复盘与行动学习、培训、绩效改进的区别与联系 六、关于复盘的几个常见误解 误解1&#xff1a;可否对他人之事进行复盘 误解2&#xff1a;“项目后评估”是复盘吗…

细粒度图像分类模型(含实战代码)

来源&#xff1a;投稿 作者&#xff1a;lsc 编辑&#xff1a;学姐 理论部分 01细粒度图片分类问题 1.1细粒度图片分类特点 可判别区域往往只是在图像中很小的一块区域内。 1.2细粒度图像分类数据集 1.3细粒度图像分类竞赛 1.4细粒度图像分类模型分类: (1)强监督模型: 需要…

Java之AQS

AQS是什么 是用来实现锁或者其它同步器组件的公共基础部分的抽象实现&#xff0c;整体就是一个抽象的FIFO队列来完成资源获取线程的安排工作&#xff0c;并通过一个int类变量表示持有锁的状态。 使用到AQS的一些类 ReentranLock: CountDownLatch ReentrantReadWriteLock:…

Go语言开发小技巧易错点100例(四)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09; 本期看点&#xff08;技巧类用【技】表示&#xff0c;易错点用…

_14LeetCode代码随想录算法训练营第十四天-C++二叉树

_14LeetCode代码随想录算法训练营第十四天-C二叉树 题目列表 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长…

RabbitMQ 第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序【生产者】

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础3 RabbitMQ 快速入门3.1 入门程序3.1.1 生产者第一天 基础 3 RabbitMQ 快速入门 3.1 入门程序 3.1.1 生产者 看下文档 点进去 先就来做一个 这个简单模式 P&…

vector

目录vector的介绍和使用vector的介绍vector的使用vector 空间增长问题vector 迭代器失效问题。&#xff08;重点&#xff09;vector与erase迭代器失效的代码vector深度剖析及模拟实现vector模拟实现代码使用memcpy拷贝问题动态二维数组理解vector反向迭代器reverse_iteratorvec…

Android开发进阶——Coil对比Glide分析

Coil概述 Coil是Android上的一个全新的图片加载框架&#xff0c;它的全名叫做coroutine image loader,即协程图片加载库。 与传统的图片加载库Glide&#xff0c;Picasso或Fresco等相比。该具有轻量&#xff08;只有大约1500个方法&#xff09;、快、易于使用、更现代的API等优…

【Vue项目搭建】vue-admin-template修改(2)

接上文、、 --------------------------------------------------------- 优化登录 单独封装路由守卫 &#xff0c;设置白名单&#xff0c;permission.js&#xff0c;鉴权 跳转动画优化&#xff08;使用NProgress插件&#xff09; 显示logo svg 改填充颜色 stroke //画线颜色…

小题 错题总结

要是对象具有序列化&#xff0c;应该实现的接口是 Java.IO.Serializable在 JVM 内存划分中 &#xff0c;方法通常存储在 方法区多态的3种表现形式&#xff1a; 继承重写 重载 向上转型Java 中继承可以间接继承&#xff0c;即便中间跨过一个类&#xff0c;栗子&#xff1a;所有…

一文读懂Linux内核中的Device mapper映射机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制&#xff0c;在该机制下&#xff0c;用户可以很方便的根据自己的需要制定实现存储资源的管理策略&#xff0c;当前比较流…

基于PHP的动漫电影信息管理系统

有需要请私信或看评论链接哦 可远程调试 基于PHP的动漫电影管理系统一 介绍 此动漫电影信息管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员&#xff0c;用户注册登录后可观看/下载/收藏/留言/评分动漫电影等&#xff0c…

Multi-Channel PCe QDMARDMA Subsystem

可交付资料&#xff1a; 1. 详细的用户手册 2. Design File&#xff1a;Post-synthesis EDIF netlist or RTL Source 3. Timing and layout constraints&#xff0c;Test or Design Example Project 4. 技术支持&#xff1a;邮件&#xff0c;电话&#xff0c;现场&…

隐私计算概述

1. 基本概念 隐私计算是指在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一些列信息技术,保障数据在流通和融合过程中的“可用不可见”。 从技术交付出发,隐私计算是众多学科的交叉融合技术,目前主流的隐私计算技术分为三大方向:第一类是多方安全计算为代…