JS函数 ,变量

2023-11-09

6函数

6.1函数的概念

大事化小,将复杂的问题简单化

如何大事化小呢?通过函数

为什么需要有函数?

首先看一下输出100以内所有素数的解决方案

方案一:循环嵌套

var n =Number(prompt("请输入一个自然数"));
var  m = Math.ceil(Math.sqrt(n));//根据数学相关定理,判断范围可缩小至[2,sqrt(n)]
var found = false;//找到因子的标志
for (var i=2; i<=m; i++){
    if(n%i == 0){
        found = true ;
        break;//找到则提前结束
    }
}
alert(found?"不是素数":"是素数");

这种解决方案程序比较复杂,阅读比较困难,需要比较高超的技术

方案二:函数

for(var n=2; n<=100;n++){
    if(isPrime(n)){
        document.write(n+"<br>");
    }
}
function isPrime( n){
    var  m = Math.ceil(Math.sqrt(n));//根据数学相关定理,判断范围可缩小至[2,sqrt(n)]
   // var found = false;//找到因子的标志
    for (var i=2; i<=m; i++){
        if(n%i == 0){
           return false;
        }
    }
    return true;
}

这个方案将一个比较复杂的问题分解为两个较为简单的问题去解决,是用“量”去克服“难”和“大”的问题。也就是“大事化小”。

这样给我们提供了一个解决规模大、难度高的问题的解决思路:它分解为多个规模相对较小,难度相对较低的问题去解决,如果分解后的问题,依然规模大、难度高,可以按着这个思路一直分解下去,知道问题分解的问题足够小、简单。归纳起来就是“大事化小”

 

6.2定义与调用

函数是什么,怎么用

定义:function isPrimen{

...........................

}

function 定义函数的关键字

isPrime是函数的名字,和变量名一样的命名规则和原则

n 形式参数(形参)

isPrime12),12就是实际参数(实参)

案例:验证100以内的数都符合角股定理

函数头部:体现的是函数的设计

函数体:体现的是函数的实现过程

设计比实现更重要

案例:验证10000以内哥德巴赫猜想成立

对于这个问题我们首先要清楚问题的大概思路,大事化小来看

首先判断一个大于6的数能否分解(分解函数)

其次判断分解的数是否是素数

最后判断什么是素数(判断素数函数)

总的来说问题在一步步化小

对于函数来说三要素必不可少

函数名、参数、结果

 

/*
假设系统有一个函数能够帮我们判断大于6的数能否分解
设计一下该函数
功能:判断一个数能否分解为两个素数之和
名称:canSplit
输入参数:待分解的数
返回结果:true/false
 */
        var flag = true;//设一个标志
        for(var n=6; n<=10000;n+=2){
            if(!canSplit(n)){
                flag = false;
                break;
            }
        }
            alert("哥德巴赫猜想成立"+(flag?"成功":"失败"));
    /*
        那么如何实现这个函数呢?不够简单,那就继续分解
        如果系统有一个能够判断素数的函数,那个问题也简单
        设计
        功能:判断一个数是否为素数
        名称:isPrime
        输入参数:待判定的数
        输出结果:true/false

     */
        function canSplit(n){
            for(var a=2; a<=n/2; a++){
                if(isPrime(a)&&isPrime(n-a)){
                    return true;
                }
            }
            return false;
        }
        function isPrime(n){
            var m=Math.sqrt(n);
            for(var i=2;i<=m;i++){
                if(n%i ==0){
                    return false;
                }

            }
            return true;
        }

函数的本质:直观理解就是实现某个独立功能的代码段,或者说它就是一个数据加工的黑箱子

输入参数→ 函数名 →输出结果

所谓“黑箱子”,就是我们只关心箱子外面的东西,比方说他是干什么的,需要输入什么东西,可以得到什么结果,而不关心里面是怎么工作的

忽略实现的细节

6.3参数传递

所谓参数传递,就是将实参的值传递给形参。通过调试可以确定形参在函数之前是不存在的,当函数被调用的那一刻,实参被创建,并且把实参传递给形参

参数传递有两种:值传递和引用传递

var a =5;
increase(a);
alert(a);
function increase(x){
    x++;
}

a的值并没有显示预期中的6,还是5。因为形参x 和实参a是两种不同的变化,x的变化和a的变化没有任何关系

引用传递

/*
引用传递
 */
var a = new Object();
a.value = 5;
increase(a);
alert(a.value);
function increase(x){
    x.value++;
}

a.value没有被显示修改,但是a.value确实加1了,因为x就是a,或者说xa的别名,专业一点就叫引用。

什么时候是引用,什么时候是值传递

常规类型的参数采用的是值传递,比如Number String Boolean

对象类型采用的是引用传递,object

如果希望把参数从函数中带出来,但是函数的返回值只有一个

6.4变量作用域

局部变量:在函数内部定义的变量,这个变量只能够在函数内部使用,在全局中不能使用,比如在三国时期,袁术称帝后,只有袁术阵营的人才认为他是皇帝,他发布的命令只有在本阵营里面起作用,但是其他人不这么认为他是皇帝,他发布的命令没有作用

function localvar(){
    var a = 1;
    alert(a);
}
localvar();
alert(a);

在函数内部定义一个变量,如果没用用var,那么这个变量被认作为全局变量。

function localallvar(){
    a = 1; //在函数内部一定要定义用var 不然就变为全局变量
}
function test(){
    alert(a);
}
localallvar();
test();

全局变量:在函数外部定义的变量,这个变量可以在全局进行使用。比如汉朝的皇帝发布了命令,那么不管是袁绍还是曹操都要听命

var a = 1;
function allvar(){
    alert(a);
}
allvar();

冲突处理原则:就近原则

 

当函数中定义了一个和全局变量名相同的变量,此时在函数中在定义前使用,那么这个变量还是函数中的变量,为undefined,不使用全局变量

要理解就近原则,而不是从上到下

局部和全局同时定义了一个相同的名字的变量时如何在局部变量里面访问全局变量?

在局部变量中给代码加上window的前缀,就可以访问到全局变量了

   var a = 1;
    function doubleVar(){
        var a = 2;
        var a = 3;
        alert(a);
//        alert(window.a);
    }
    doubleVar();

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS函数 ,变量 的相关文章

  • 强化学习的几种环境介绍

    前言 对于强化学习相关的几种环境介绍 主要包括Mini world Gym maze Grid world gym minigrid Mini world https github com maximecb gym miniworld Mi

随机推荐

  • 用c语言设计加减乘除自动出题程序,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    include include stdlib h define N 10 void fun int a b t char c scanf d a scanf c c scanf d b if c c c c c if c t a b if
  • 关于unique case和priority case语法

    SystemVerilog对于case casez casex语句新增了两个特殊的修饰符 unique及priority 其语法规则如下 unique case
  • 疫情信息获取。

    爬取目标 腾讯新闻 疫情数据 确定信息 在目标网页按F12 在全局数据中寻找 发现有目标数据 接下来在Network中寻找数据并在Headers中获得链接地址 也可以点击搜索查找 较为方便 省份数据和全球数据也是同样的方法 注意图二 最终确
  • 【JS逆向】之webpack逆向实战

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵权 请告知删除 谢谢 目标网站 aHR0cHM6Ly8xNTE0NjQ2LmNvbS9sb2dpbg 引言 webpack对于有研究过人的来说就是 难度并不是很高 但是因为web
  • xss过滤绕过方法总结

    xss注入常用语句 1 2 img src 3 img src 4
  • JS 将数组写入表单

    将数据写入表单 var rowData 1 2 3 function insertToForm rowData if rowData length lt 1 alert 没有数据 else var form formID for var i
  • C++中的类模板定义及实例化

    转载自Out man 文章目录 一 类模板定义及实例化 定义一个类模板 类模板实例化 二 类模板的成员函数 一 类模板定义及实例化 定义一个类模板 template
  • 关于C/C++运算符优先级问题探讨

    最近在知乎上看到一个c c 运算符连写的问题 引发了诸多网友的讨论 具体内容如下图 乍一看 这句代码很长 确实有些让人糊涂 尤其是学习过python的同学 对此写法不太理解 今天我们一起来说一说 优先级 在c语言的表达式中 如果存在多个运算
  • 第1章-爬虫简介(http请求)

    第1章 爬虫简介 一 通讯协议 二 网络模型 三 Http请求与响应 3 1 Http通信 3 2 Http请求 3 3 Http请求方法 四 几个概念 4 1 GET和POST 4 2 URL组成部分 4 3 User Agent 户代理
  • 基于Linux环境的PPPOE服务器搭建

    转载 https www imooc com article 50559 VMware ubuntu虚拟机上搭建PPPOE服务器 https blog csdn net rheostat article details 8069778
  • 随手记怎么样靠谱吗?随手记平台不触碰用户资金

    随着经济的快速发展和人们理财意识的增强 互联网理财在人们的日常生活中逐步普及 而随手记作为随手集团旗下集手机记账 财务规划 金融服务 社区投资者教育等功能于一体的个人财务管理和金融服务品牌 其推出的理财产品受到不少理财投资者的青睐 但是 随
  • 什么是渲染目标(render target)&& 渲染到纹理(Render To Texture, RTT)详解

    渲染到纹理 Render To Texture RTT 详解 RTT是现在很多特效里面都会用到的一项很基本的技术 实现起来很简单 也很重要 但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿 不知道是因为太简单还是因为这项技术已经出现
  • docker安装觅思文档(mrdoc)

    mrdoc文档地址 https mrdoc fun doc 18 mrdoc项目地址 GitHub zmister2016 MrDoc mrdoc online document system developed based on pyth
  • STM32逆变器控制

    ADC引脚分配 直流电压 Vc1 PA0 Vc2 PA1 电网电压 U1 V1 W1 AD7323 PB3 PB4 PB5 逆变器输出电压 UCA UCB UCC AD7323 PB13 PB14 PB15 电容电流采样 ICa ICb I
  • Mybatis解释及Mybatis项目搭建

    一 什么是Mybatis MyBatis是一个持久层框架 属于JDBC的替代方案之一 他的前身是iBatis 它属于ORM关系型映射 ORM O R Mapping 对象关系映射 是一种把内存中的对象保存到关系型数据库的技术 用它封装数据库
  • jmeter报错:jmeter java.net.SocketException: Connection reset

    jmeter java net SocketException Connection reset 网络慢 导致
  • HBuilder mui登录和访问控制教程

    HBuilder mui登录和访问控制教程 mui中提供了登录的模板页 但是对于登录后各个页面的访问控制 刷新等并没有官方的推荐方案 我在这里简单说一种初级的解决方案吧 肯定有不足指出 欢迎批评指正 第一节中创建移动APP项目的时候选择的是
  • micropython 通过spi驱动LCD显示屏

    我呢一直对电路设计和程序设计有非常大的爱好 不好说有多精通 纯属个人弄着玩的 所以后面有时间可以和大家一起来交流一下 另外最近也接触了一些PCB 所以一些开发板之类的都自己设计制作了 今天讲的是通过micropython来驱动LCD显示 用
  • 解决数据库死锁现象

    解决数据库死锁现象 一 日志情况 日志情况如下 信息 At least one JAR was scanned for TLDs yet contained no TLDs Enable debug logging for this log
  • JS函数 ,变量

    6函数 6 1函数的概念 大事化小 将复杂的问题简单化 如何大事化小呢 通过函数 为什么需要有函数 首先看一下输出100以内所有素数的解决方案 方案一 循环嵌套 var n Number prompt 请输入一个自然数 var m Math