JavaScript(函数,作用域和闭包)

目录

  • 一,什么是函数
    • 1.1,常用系统函数
    • 1.2,函数声明
  • 1.3,函数表达式
  • 二,预解析
    • 2.1,函数自调用
  • 2.2,回调函数
  • 三,变量的作用域
    • 3.1,隐式全局变量
  • 四,作用域与块级作用域
  • 五,作用域链
  • 六,闭包

一,什么是函数

类似于Java中的方法,是完成特定任务的代码语句块
特点
使用更简单
不用定义属于某个类,直接调用执行
分类
系统函数
自定义函数

1.1,常用系统函数

1.将字符串转换为整型数字

parseInt("字符串");

<body>
    <input type="button" value="求和" onclick="qiuhe()">
</body>
<script>
	var num1 = parseInt("56.64");      //返回值为56
	var num2 = parseInt("123abc");   //返回值为123
	var num3 = parseInt("hello999"); //返回值为NaN
	console.log(num1,num2,num3);

	 function qiuhe(){
       var n1 = prompt("请输入第一个数")
        var n2 = prompt("请输入第二个数")
        var num1=parseInt(n1)
        var num2=parseInt(n2)
        if(isNaN(num1)||isNaN(num2)){
            alert("有一个不是数字");
        }else{
            document.write(num1+num2)
        }
    }
</script>

js示例1

在这里插入图片描述

从下标为0起,依次判断每个字符是否可以转换为一个有效数字
如果不是有效数字,则返回NaN,不再继续执行其他操作
如果是有效数字,则该函数将查看下标为1的字符,进行同样的测试,直到发现非有效数字的字符或全部检测完为止

2.将字符串转换为浮点型数字

parseFloat("字符串");

var num1 = parseFloat("3.1415926");  //返回值为3.1415926
var num2 = parseFloat("123abc");       //返回值为123
var num3 = parseFloat("hello999");     //返回值为NaN
var num4 = parseFloat("52.18.97");     //返回值为52.18 如果有两个小数点则第二个小数点无效
console.log(num1,num2,num3);

在这里插入图片描述

3.检查其参数是否是非数字

isNaN(x);

var num1=isNaN("20.5");       //返回值为false
var num2=isNaN("123abc");  //返回值为true
var num3=isNaN(48.98);       //返回值为false
console.log(num1,num2,num3);

在这里插入图片描述

通常,使用isNaN()函数检测parseInt()和parseFloat()的运算结果,判断它们表示的是否是合格的数字;也可以使用isNaN()函数检测
操作数是否有错误,例如:用0作为除数的情况

1.2,函数声明

由关键字function、函数名、一组参数及置于括号中的待执行的JavaScript语句组成

语法

		// JavaScript是弱数据类型,对于函数参数没有类型检查和类型限定
	function 函数名([参数1[, 参数2[, 参数3,] ] ]) {
	    //JavaScript语句;
	    [return 返回值] // return可有可无
	}

调用函数

// 一般和表单元素的事件一起使用
事件名=“函数名([参数值1[, 参数值2[, 参数值3,] ])";

函数声明——调用无参函数

// 定义并调用无参函数,输出5次“你好”
<body>
	//单击此按钮时,调用函数func1( ),执行函数体中的代码
    <input type="button" value="点我执行" onclick="func1()">
</body>
<script>
    function func1(){
        for(var i=0;i<5;i++){
            document.write("<h1>你好"+i+"</h1>")
        }
    }
</script>

js示例2

函数声明——调用有参函数

	// 键盘接受“你好”输出行数,并按指定数字输出到网页
 <body>
    <input type="button" value="点我执行" onclick="func1(prompt('请输入显示你好的次数:'))">
</body>
<script>
    function func1(count){
        for(var i=0;i<5;i++){
            document.write("<h1>你好"+i+"</h1>")
        }
    }
</script>

js示例3

1.3,函数表达式

将函数赋给变量
定义函数

var 变量 = function([参数值1[, 参数值2[, 参数值3,] ]) {
    //JavaScript语句;
};

调用函数

变量([参数值1[, 参数值2[, 参数值3,] ]);

函数表达式

 	// 使用函数声明的方式定义两个函数名都为f1()的函数
 	    f1();
    function f1(){
        var num3 = 100;
        console.log(num3)
    }
    function f1(){
        console.log("今天天气很好!")
    }
    f1();
    function f1(){
        console.log("今天天气好晴天,处处好风光");
    }
    f1();

在这里插入图片描述

	// 使用函数表达式方式定义两个函数名都为f2()的函数
	    var f2 = function(){
        console.log("哇~");
    }
    f2();
    var f2 = function(){
        console.log("娃哈哈~");
    }
    f2();

在这里插入图片描述

使用函数声明方式定义两个同名的函数时,后面的函数将会覆盖前面的函数;
使用函数表达式方式定义同名的函数时,会从上到下,逐行执行代码,并输出结果

二,预解析

顾名思义就是提前解析代码
主要完成两项工作
其一,变量的声明会提前
其二,函数的声明也会被提前

// 预解析可以把变量的声明提前
console.log(num); //undefined
var num=10;

// 预解析可以把函数的声明提前
f1();
function f1() {
    var num=100;
    console.log(num); //100
}

在这里插入图片描述

2.1,函数自调用

自定义函数分类
命名函数
匿名函数

语法

(function() {
	//函数体	    
})();

匿名函数的特点
函数没有名字,在声明的同时便直接调用
好处
同名函数之间不会有冲突

    (    function(){
        console.log("立即执行函数");
    })();

在这里插入图片描述

2.2,回调函数

注意
如果没有指定回调函数的名称,则称之为 匿名回调函数

    function f1(fn){
        console.log("f1");
        fn()
    };
    function f2(){
        console.log("f2");
        return 1
    };

    f1(f2); // 执行命名回调函数,注意f2后面不能加()

在这里插入图片描述

    function f1(fn){
        console.log("f1");
        fn()
    };
    f1(function(){ // 匿名函数
        console.log("我没有名字!");
    })

在这里插入图片描述

三,变量的作用域

根据变量作用范围不同,分类
局部变量
在函数内部声明的变量(必须使用var)
只能在函数内部访问它
可以在不同的函数中使用名称相同的局部变量
全局变量
在函数外声明的变量
网页的所有脚本和函数都能访问它

    var x = 10;
    function f1(){
        var y = 5;
        console.log(x); // 10
        console.log(y); // 5
    }
    f1();
    console.log(x); // 10
    console.log(y); // y is not defined

在这里插入图片描述

局部变量与全局变量的区别

区别局部变量全局变量
作用域仅作用在函数中作用在整个脚本
声明位置函数中使用之前的任何位置
生存期在函数运行以后被删除在页面关闭后被删除

3.1,隐式全局变量

如果变量声明时,没有使用关键字var,则被称为隐式全局变量

示例

var a1 = 1;  //全局变量
a2 = 2;        //隐式全局变量

如果在函数内部声明变量时,没有使用关键字var,则也是隐式全局变量

    function f1(){
        var num = 100;
    }
    f1();
    console.log(num); // 函数会报错

在这里插入图片描述

    function f1(){
        num = 100;
    }
    f1();
    console.log(num);

在这里插入图片描述

与解析:
1.会把全局变量的“声明”提前
2.提前声明函数,但是函数内部的代码是不执行的
局部变量:必须在函数内部使用var/let声明,如果不使用,则称为隐式全局变量
隐式全局变量:只有在执行后使用,
全局变量和局部变量可以重名,使用就近原则

四,作用域与块级作用域

作用域
是变量与函数的可访问范围
控制着变量与函数的可见性和生命周期
块级作用域
由花括号“ { } ”限定
所有的变量都定义在花括号内
变量从定义开始到花括号结束的范围内可以使用
使用场景
正常带有大括号的语句
条件语句
循环语句
函数

    正常带有大括号的语句
    {
        var num = 10;
    }
    console.log(num); // 10

    // 条件语句
    if(true){
        var num = 20;
    }
    console.log(num); // 20

    // 循环语句
    for(var i=0;i<5; i++){
        var num = 30;
    }
    console.log(num); // 30

    // 函数
    function f1(){
        var num  = 50;
    }
    f1();
    console.log(num); // num is not defined

五,作用域链

Scope Chain
是JavaScript内部一种变量、函数查找机制
决定了变量和函数的作用范围
当执行函数时,先从函数内部寻找局部变量
如果内部找不到,则向创建函数的作用域寻找,依次向上
如果最终没有找到,通常会报错

    var num = 10; // <script>里定义的变量,是0级作用域
    function f1(){
        var num = 20; // 1级作用域
        function f2(){
            var num = 30; // 2级作用域
            function f3(){
                var num = 50; // 3级作用域
                console.log(num);
            }
            f3();
        }
        f2();
    }
    f1()

在这里插入图片描述

六,闭包

如何在函数外部读取函数内的局部变量呢?
闭包(closure)
能够读取其他函数内部变量的函数
是将函数内部和函数外部链接起来的桥梁
实现步骤
在一个函数的内部,再定义一个函数
把内部的函数作为返回值
特性
函数嵌套
内部函数可以访问外部函数的变量
参数和变量不会被回收
最典型的应用
实现回调函数

    // 1.在函数内部定义一个函数
    // 2. 把内部函数作为外部函数的返回值
    // 原理:利用了内部函数可以调用外部函数的变量
    function f1(){
        var num = 20;
        function f2(){
            alert(num);
        }
        return f2;
    }
    var result = f1();
    result();

在这里插入图片描述

作用
可以读取函数内部的变量
让这些变量的值始终保存在内存中
缺点
在父函数外部,可以改变父函数内部变量的值
常驻内存,会增大内存使用量,使用不当很容易造成内存泄露

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于sd卡根目录在哪里

你说的对,一切都会过去,哪怕是回忆。 sd卡根目录在哪里 1、手机要有SD卡才会存在SD卡根目录。 2、打开文件管理并在此页面下点击所有文件。 3、点击SD卡选项进入的页面就是SD卡根目录。 4、SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备&#xff0c;由于它体积小、数…

[Pandas] pandas.melt

melt是溶解 / 分解的意思&#xff0c;即拆分数据 melt()函数可以将一些列的内容进行合并&#xff0c;把宽表整合成长表 语法格式 pandas.melt(frame, id_varsNone, value_varsNone, var_nameNone, value_namevalue)参数说明 frame&#xff1a;要处理的数据集 id_vars&#…

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…

docker 安装 Nginx

1、下载 docker pull nginx:latest 2、本地创建管理目录 mkdir -p /var/docker/nginx/conf mkdir -p /var/docker/nginx/log mkdir -p /var/docker/nginx/html 3、将容器中的相应文件复制到管理目录中 /usr/docker/nginx docker run --name nginx -p 80:80 -d nginxdocke…

Golang数据结构和算法

Golang数据结构和算法 数据的逻辑结构和物理结构常见数据结构及其特点算法的时间复杂度和空间复杂度Golang冒泡排序Golang选择排序Golang插入排序Golang快速排序Golang归并排序Golang二分查找Golang sort包Golang链表Golang container/list标准库Golang栈stackGolang二叉搜索树…

Spring Security存在认证绕过漏洞 CVE-2021-22096

文章目录 0.前言1.参考文档2.基础介绍漏洞影响范围&#xff1a;官方说明&#xff1a;修复版本&#xff1a;漏洞利用步骤&#xff1a;修复方式&#xff1a; 3.解决方案 0.前言 背景&#xff1a;项目被扫到Spring Boot 的漏洞&#xff0c;严格的说应该是Spring Security 组件的漏…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时&#xff0c;返回错误信息&#xff1a;{errMsg: “getUserProfile:fail api scope is…

宿舍固定资产怎么管理

宿舍固定资产的管理需要做到以下几点&#xff1a; 固定资产购置&#xff1a;宿舍的固定资产包括设备、家具、厨房用品等&#xff0c;购置时需要注意质量和价格&#xff0c;并进行登记。 固定资产登记&#xff1a;将宿舍的固定资产名称、型号、规格、数量、单价、金额、…

详细说明OSPF常见的LSA

目录 1类LSA &#xff08;Router LSA&#xff09;介绍 总结&#xff1a;1类LSA 2类LSA &#xff08;Network LSA&#xff09;介绍 总结&#xff1a;2类LSA 3类LSA &#xff08;Summary LSA&#xff09;介绍 总结&#xff1a;3类LSA 5类LSA &#xff08;ase LSA&…

layUI 中 穿梭框无法获取值的细节问题

初始化的时候一定要指定id&#xff0c;不然就会出现无法调用 获得右侧数据和实例重载的方法

高忆管理:A股上市券商“中考”成绩放榜,最大黑马是它

A股上市券商2023年半年报发表8月30日晚正式收官。全体上看&#xff0c;43家券商中有10家营收超百亿元&#xff0c;多达30家完成了营收及净利润的双增。头部券商中&#xff0c;我国银河近年来运营成绩排名稳步提高&#xff1b;区域性券商中&#xff0c;天风证券成最大黑马&#…

经典文献阅读之--FastSAM(快速分割一切)

0. 简介 MetaAI提出的能够“分割一切”的视觉基础大模型SAM提供了很好的分割效果&#xff0c;为探索视觉大模型提供了一个新的方向。虽然SAM的效果很好&#xff0c;但由于SAM的backbone使用了ViT&#xff0c;导致推理时显存的占用较多&#xff0c;推理速度偏慢&#xff0c;对硬…

多图详解VSCode搭建Java开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

LeetCode--HOT100题(46)

目录 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

Stable Diffusion WebUI 整合包

现在网络上出现的各种整合包只是整合了运行 Stable Diffusion WebUI&#xff08;以下简称为 SD-WebUI&#xff09;必需的 Python 和 Git 环境&#xff0c;并且预置好模型&#xff0c;有些整合包还添加了一些常用的插件&#xff0c;其实际与手动进行本地部署并没有区别。 不过&a…

[linux实战] 华为云耀云服务器L实例 Java、node环境配置

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 高校汉服租赁网站的 设计与实现

一.项目介绍 高校汉服租赁网站分为普通用户以及管理员两类 普通用户&#xff1a; 注册、登录系统、查看汉服首页发帖公告信息、 交流论坛&#xff08;发帖、查看帖子、评论&#xff09;、 公告咨询&#xff08;查看公告以及评论&#xff09;、 汉服信息&#xff08;查…

CotEditor for mac 4.0.1 中文版(开源文本编辑器)

coteditorformac是一款简单实用的基于Cocoa的macOS纯文本编辑器&#xff0c;coteditormac版本可以用来编辑网页、结构化文本、程序源代码等文本文件&#xff0c;使用起来非常方便。 CotEditor for Mac具有正则表达式搜索和替换、语法高亮、编码等实用功能&#xff0c;而CotEdi…

IntelliJ IDEA快捷键大全 + 动图演示,建议收藏!

本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&#xff08;Windows 版&#xff09;的所有快捷键。并在此基础上&#xff0c;为 90% 以上的快捷键提供了动图演示&#xff0c;能够直观的看到操作效果。 该快捷键共分 16 种&#xff0c;可以方便的按各类查找自…