严格模式和高阶函数

news2024/12/25 9:00:57

1、什么是严格模式

JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)

ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,即在严格的条件下运行 JS 代码。

严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。

严格模式对正常的 JavaScript 语义做了一些更改:

  1. 消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。
  2. 消除代码运行的一些不安全之处,保证代码运行的安全。
  3. 提高编译器效率,增加运行速度。
  4. 禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:class, enum, export, extends, import, super 不能做变量名

2、开启严格模式

        严格模式可以应用到整个脚本个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。

(1)为脚本开启严格模式

        有的 script 基本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他 script 脚本文件。

(function (){
  //在当前的这个自调用函数中有开启严格模式,当前函数之外还是普通模式
    "use strict";
       var num = 10;
    function fn() {}
})();
//或者 
<script>
   "use strict"; //当前script标签开启了严格模式
</script>
<script>
  			//当前script标签未开启严格模式
</script>

(2)为函数开启严格模式

要给某个函数开启严格模式,需要把“use strict”; (或 'use strict'; ) 声明放在函数体所有语句之前

function fn(){
  "use strict";
  return "123";
} 
//当前fn函数开启了严格模式

将 "use strict" 放在函数体的第一行,则整个函数以 "严格模式" 运行。

3、严格模式中的变化

严格模式对 Javascript 的语法和行为,都做了一些改变。

3.1、变量规定

  • 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var 命令声明,然后再使用。
  • 严禁删除已经声明变量。例如,delete x; 语法是错误的。

3.2、严格模式下 this 指向问题

  • 以前在全局作用域函数中的 this 指向 window 对象。
  • 严格模式下全局作用域中函数中的 this 是 undefined
  • 以前构造函数时不加 new也可以 调用,当普通函数,this 指向全局对象
  • 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
  • new 实例化的构造函数指向创建的对象实例。
  • 定时器 this 还是指向 window 。
  • 事件、对象还是指向调用者。

3.3、函数变化

  1. 函数不能有重名的参数。
  2. 函数必须声明在顶层.新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。

更多严格模式要求参考:文档

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        'use strict';
        // 1. 我们的变量名必须先声明再使用
        // num = 10;
        // console.log(num);
        var num = 10;
        console.log(num);
        // 2.我们不能随意删除已经声明好的变量
        // delete num;
        // 3. 严格模式下全局作用域中函数中的 this 是 undefined。
        // function fn() {
        //     console.log(this); // undefined。

        // }
        // fn();
        // 4. 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错.
        // function Star() {
        //     this.sex = '男';
        // }
        // // Star();
        // var ldh = new Star();
        // console.log(ldh.sex);
        // 5. 定时器 this 还是指向 window 
        // setTimeout(function() {
        //     console.log(this);

        // }, 2000);
        // a = 1;
        // a = 2;
        // 6. 严格模式下函数里面的参数不允许有重名
        // function fn(a, a) {
        //     console.log(a + a);

        // };
        // fn(1, 2);
        function fn() {}
    </script>
</body>

</html>

4、高阶函数 

  • 高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出
  • 此时fn 就是一个高阶函数
  • 函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。 最典型的就是作为回调函数。
  • 同理函数也可以作为返回值传递回来

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="jquery.min.js"></script>
    <style>
        div {
            position: absolute;
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div></div>
    <script>
        // 高阶函数- 函数可以作为参数传递
        function fn(a, b, callback) {
            console.log(a + b);
            callback && callback();
        }
        fn(1, 2, function() {
            console.log('我是最后调用的');

        });
        $("div").animate({
            left: 500
        }, function() {
            $("div").css("backgroundColor", "purple");
        })
    </script>
</body>

</html>

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

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

相关文章

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前&#xff0c;C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因&#xff1a; 2、消失的梯度问题 3、不稳定的梯度问题 参考文章&#xff1a;为什么很难训练深度神经网络&#xff1f; - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因&#xff1a; 训练速度慢 在深度网络中&#xff0c;不同的层学习…

《UEFI内核导读》UEFI Firmware Storage简介

敬请关注&#xff1a;“固件C字营 UEFI固件一般存储在被称之为“固件仓库”的非易失性存储器中&#xff0c;简称为FD&#xff08;固件设备&#xff09;&#xff0c;当前主流的存储介质是NorFlash它拥有非易失性、XIP以及可二次编程的特性。 固件设备可以分为物理设备和逻辑设备…

linux如何发送查收邮件的详解

一&#xff0c;linux用户发送给linux中的其它用户 1&#xff0c;使用命令 yum install sendmail -y安装sendmail软件 2&#xff0c;使用yum install mailx -y安装 mailx软件 3&#xff0c;使用命令systemctl start sendmail启动sendmail&#xff08;此过程消耗时间&#xff09…

你在项目里遇到的最大困难是什么,如何解决的?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/Tyson0314/Java-…

Weiler-Atherton 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Weiler Atherton多边形裁剪算法是一种允许裁剪凹面算法的算法。与 Sutherland-Hodgman 多边形裁剪算法最主要的区别是&#xff0c;该算法能够裁剪凹多边形&#xff0c;并不留下任何残留物。 裁剪示意图&#xff1…

关于微服务,这些你都了解吗-微服务介绍

文章目录一 认识微服务1.1 什么是微服务1.2 微服务的特点1.3 微服务诞生背景1.4 微服务架构的优势二 微服务生态1.1 硬件层1.2 通信层1.3 应用平台层1.4 微服务层三 微服务详解1.1 微服务架构1.2 服务注册和发现1.3 rpc调用和服务监控四 微服务与DDD1.1 什么是DDD1.2 DDD作用1.…

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1&#xff0c;先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我&#xff0c;文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来&#xff0c;C其实隐藏了非常多的东西&#xff0c;很多事情它会在编译的时候包揽&#xff0c;那么作为最为重要的类和对象&#xff0c;它是不是还隐含了更多我们平常看不到的东西呢&#xff1f; 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器&#xff08;Extension ClassLoader&#xff09; 应用程序类加载器&#xff08;系统类加…

阿里云计算工程师ACP考题归类解析

目录考纲答题技巧四式记的牢三妙招一、对象存储OSS二、专有网络VPC三、服务器ECS四、安全五、阿里云弹性伸缩Auto Scaling五、内容分发网络CDN总结考纲 重点学习ECS、VPC、OSS三部分。 答题技巧四式 战略是先做简单后做难度高的。 一、简化 做题问三个问题&#xff0c;按回答…

【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布

目录 通过 Ingress-nginx 实现灰度发布 一、Ingress Controller 多种发布策略介绍 场景一&#xff1a;将新版本灰度给部分用户 场景二&#xff1a;切一定比例的流量给新版本 二、模拟部署生产测试版本 Web 服务 2.1 部署一个 v1 版本: 2.2 再部署一个 v2 版本: 2.3 再…

论文投稿指南——中文核心期刊推荐(化学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

本地方法接口

什么是本地方法 简单地讲&#xff0c;一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法&#xff1a;该方法的实现由非Java语言实现&#xff0c;比如C。这个特征并非Java所特有&#xff0c;很多其它的编程语言都有这一机制&#xff0c;…

AQS核心原理之

AQS系列 1、AQS核心原理之 2、ReentrantLock 原理及示例 文章目录AQS系列一、什么是AQS?二、AQS特性三、AQS内部维护 state四、队列4.1 同步等待队列4.2 条件等待队列5、总结一、什么是AQS? AQS全称是 AbstractQueuedSynchronizer&#xff08;抽象对了同步器&#xff09;&am…

Cento6从零开始用Nginx+mysql+php搭建Discuz在线论坛系统

首先我的liunx使用版本是 centos6.5 32位 discuz版本是Discuz_X3.2_SC_UTF8.zip Xshell版本是6 xftp是7版本 mysql也是是这个版本&#xff1a;mysql这里写目录标题1.yum安装php2.安装nginx包3.安装php-fpm4.安装php-mysql5. 安装Discuz在线论坛系统由于目前yum源已经无法使用需…

力扣 2037. 使每位学生都有座位的最少移动次数

题目 一个房间里有 n 个座位和 n 名学生&#xff0c;房间用一个数轴表示。给你一个长度为 n 的数组 seats &#xff0c;其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students &#xff0c;其中 students[j] 是第 j 位学生的位置。 你可以执行以下操作任…

unidbg案例-爱库存app之sig和sign分析

新年的第一篇文章,新的一年继续加油,奥利给!冲冲冲。 今天分析的app是爱库存,版本号6.1.6,这次还是使用unidbg分析该样本,加密参数有很多,不过只关注sig和sign两个参数。 老规矩,上来先抓个包。 1.抓包 可以看到上面👆🏻的sign,就是本次研究的重点。 2.jadx静…

A* 算法详解(超级详细讲解,附有大图)

目录 引入 一.基本概念 二.算法原理 ①用宽度优先搜索 ②狄克斯特拉算法 ③A*算法 三.需要注意 四.c伪代码 最后 引入 今天想跟大家聊的&#xff0c;是我们经常用到&#xff0c;但是却让大家觉得十分神秘的那个算法&#xff1a;A* 。 这是一个远古而又非常经典的游戏…