JavaScript-8

源代码编译php-v8js扩展 花了一下午+一晚上的时间总算搞定了v8js的php扩展了。             大部分时间还是在google上面,但是,可惜的是,貌似V8引擎扩展少有人接触,google上资料基本灭绝,除了某开源网站上千篇一律地被转载的pecl的安装方法,再也没有源代码安装的实例。             所以就有了这篇post,希望能给刚开始入手的兄弟们一点提示,也是为了备忘(话说,我这人忘性比较大:- 阅读详情

异常处理

抛异常

  • 异常处理指"预估代码执行过程中可能发生的错误",最大程度的避免错误的发生导致整个程序无法继续运行

  • throw 抛出异常信息,程序也会终止执行

  • throw 后面跟的是"错误提示信息"

  • Error 对象配合 throw 使用,能够设置更详细的错误信息

    <script>
        function add(x, y) {
            if (!x || !y) {
                // throw '参数不能为空'
                throw new Error('没有参数传递进来')
            }
            return x + y
        }
        console.log(add());
    </script>

捕获异常

<body>
    <p>123</p>
    
    <script>
        try {
            const p = document.querySelector()
            p.style.color = 'red'
        } catch (err) {
            console.log(err.message);
        }

        finally {
            console.log('一定会执行这里')
            alert('OVER')
        }
    </script>
</body>

debugger

    <script>
        function cloneDeep(arr) {
            debugger    // 如果写上这一行代码,就意味着程序将在这里暂停,等待你的调试
            
            for(let i = 0; i < arr.length; i++) {
                console.log(i);
            }
        }
    </script>

性能优化

防抖

基本概念

单位时间内,频繁触发事件,先取消前面的,只执行最后一次

具体演示

  • 要求:鼠标在盒子上移动,鼠标停止500ms之后(即半秒),里面的数字才会累加+1
  • 实现方式:利用 lodash 工具库提供的防抖来实现
<body>
    <div class="box" style="width: 200px; height: 200px; background-color: pink;"></div>

    <!-- 引入lodash库 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    <script>
        const box = document.querySelector('.box')
        let i = 1
        function add() {
            box.innerHTML = i++
        }

        // 利用lodash库实现防抖---500毫秒之后进行+1操作
        box.addEventListener('mousemove', _.debounce(add, 500))
    </script>
</body>

拓展部分:手写防抖函数,模拟debounce的防抖功能

<body>
    <div class="box" style="width: 200px; height: 200px; background-color: pink;"></div>

    <script>
        const box = document.querySelector('.box')

        // 模拟debounce防抖
        function debounce(func, time) {
            let timer
            return function () {
                if (timer) clearTimeout(timer)
                timer = setTimeout(func, time)
            }
        }

        // 我的功能
        let i = 1
        function add() {
            box.innerHTML = i++
        }
        box.addEventListener('mousemove', debounce(add, 500))
    </script>
</body>

节流

基本概念

单位时间内,频繁触发事件,只执行最开始的一次

具体演示

<body>
    <div class="box" style="width: 200px; height: 200px; background-color: pink;"></div>

    <!-- 引入lodash库 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    <script>
        const box = document.querySelector('.box')
        let i = 1
        function add() {
            box.innerHTML = i++
        }

        // 利用lodash库实现节流---3000毫秒之后进行+1操作
        box.addEventListener('mousemove', _.throttle(add, 3000))
    </script>
</body>

拓展部分:手写节流函数,模拟throttle的节流功能

<body>
    <div class="box" style="width: 200px; height: 200px; background-color: pink;"></div>

    <script>
        const box = document.querySelector('.box')

        // 模拟throttle节流
        function throttle(func, time) {
            let timer
            return function () {
                if (timer) return
                timer = setTimeout(() => {
                    func()
                    timer = null    // 清除定时器
                    // 注意:在setTimeout中是无法删除定时器的(即:clearTimeout()不起作用),因为定时器还在运作,所以使用timer = null的形式
                }, time)
            }
        }
        
        // 我的功能
        let i = 1
        function add() {
            box.innerHTML = i++
        }
        box.addEventListener('mousemove', throttle(add, 500))
    </script>
</body>

总结对比

性能优化说明使用场景
防抖单位时间内,频繁触发事件,只执行最后一次搜索框搜索输入、手机号、邮箱验证输入监测
节流单位时间内,频繁触发事件,只执行最初一次高频事件:鼠标移动mousemove、页面尺寸缩放resize、滚动条滚动scroll等

案例演示

前置知识

  • ontimeupdate 事件:在视频/音频(video/audio)当前的播放位置发生改变时触发
  • onloadeddata 事件:在当前帧的数据加载完成,而且还没有足够的数据播放视频/音频(video/audio)的下一帧时触发
  • video.currentTime:获取视频当前播放的时间
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .container {
            width: 1200px;
            margin: 0 auto;
        }

        .video video {
            width: 100%;
            padding: 20px 0;
        }

        .elevator {
            position: fixed;
            top: 280px;
            right: 20px;
            z-index: 999;
            background: #fff;
            border: 1px solid #e4e4e4;
            width: 60px;
        }

        .elevator a {
            display: block;
            padding: 10px;
            text-decoration: none;
            text-align: center;
            color: #999;
        }

        .elevator a.active {
            color: #1286ff;
        }

        .outline {
            padding-bottom: 300px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="header">
            <a href="#">
                <img src="#" alt="">
            </a>
        </div>
        <div class="video">
            <video src="https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218114723HDu3hhxqIT.mp4"
                controls></video>
        </div>
        <div class="elevator">
            <a href="javascript:" data-ref="video">视频介绍</a>
            <a href="javascript:" data-ref="intro">内容简介</a>
            <a href="javascript:" data-ref="outline">评论列表</a>
        </div>
    </div>

    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    <script>
        // 1. 获取视频对象
        const video = document.querySelector('video')

        // 2. 操作视频对象
        // ontimeupdate触发的频率太高,我们可以进行节流,设定1秒种触发一次
        video.ontimeupdate = _.throttle(() => {
            // 把当前的视频播放时间存储到本地
            localStorage.setItem('currentTime', video.currentTime)
        }, 1000)

        // 3. 打开页面触发事件————从本地存储中取出记录的时间,并进行跳转
        video.onloadeddata = () => {
            video.currentTime = localStorage.getItem('currentTime') || 0
        }
    </script>
</body>

</html>
Node.js 中的 V8 引擎:JavaScript 引擎的核心 V8 引擎是 Node.js 的核心组件之一,它负责解析、编译和执行 JavaScript 代码。V8 引擎使用先进的技术和优化策略,提供高性能和快速的执行速度。通过了解 V8 引擎的工作原理,我们可以更好地理解 Node.js 的内部机制,并编写高效的 JavaScript 代码。希望本文对你理解 V8 引擎有所帮助! 阅读详情

相关推荐

NVMe-MI --- Message Servicing Model(消息服务模型)

本文主要介绍NVMe-MI消息服务模型,两个主要类别是请求消息和响应消息。并介绍带外机制消息服务状态机。

智小星的博客 2012

推荐项目:V8 JavaScript 引擎 PHP 扩展 - V8JS

V8JS 是一个开源的 PHP 扩展,它允许在 PHP 环境中使用 Google 的 V8 JavaScript 引擎执行 JavaScript 代码。通过 V8JS,您可以将 JavaScript 用于后端服务、脚本任务或与 PHP 应用程序集成。 ## V8JS 可以用来做什么? 1. 在服务器端运行 JavaScript 代码 2. 在 PHP 中调用 JavaScript 函数库 3....

gitblog_00020的博客 1551

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

v8js-在PHP中运行javascript代码

起因 之前写自动登录操作一个网站的PHP脚本,但是发现该网站用js代码做了cookie的计算和验证,所以使用了v8js。 安装 安装v8。(Mac:brew install v8) 使用pecl install v8js 安装的过程中要求输入v8的安装目录。 安装完之后,把生成的.so动态链接库引入到ini文件中。 include_path = ".:/usr/lib/php/pear" e...

March 2万+

ESD笔记(三)_常用ESD保护电路优缺点

根据ESD防护器件的TLP I-V特性我们可将ESD器件分为回滞类和非回滞类两种; 回滞类的ESD器件包括NPN三极管、栅极接地 NMOS ( GGNMOS, Gate-grounded NMOS )、可控桂(SCR, siliconcontrolled rectifier)等。 非回滞类的ESD器件包括二极管、二极管串、沟道工作的MOS管、PNP三极管、栅极接电源的PMOS(GDPMOS)等,与回滞类ESD器件相比,其TLP曲线没有负阻区的存在。 常用于ESD防护的器件包括PN结二极管、GGN

weixin_47139649的博客 1万+

探索Three.js:利用ShaderMaterial实现动态着色器特效

本文深入探讨了Three.js中ShaderMaterial的应用,指导开发者利用GLSL编写自定义着色器实现动态特效。文章从核心概念GLSL、Uniforms与Attributes讲起,通过创建动态颜色变化平面的实战案例,逐步进阶到实现波纹扩散与动态光影等高级效果,并提供了性能优化与调试技巧,帮助读者掌握创建高性能WebGL视觉特效的关键技能。

weixin_29250403的博客 201

java8 执行javascript_Java8中执行js脚本

代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JSimport jdk.nashorn.api.scripting.ScriptObjectMirror;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script...

weixin_36272079的博客 822

Virtuoso ADE Explorer实战技巧:从基础操作到高级仿真

本文深入解析了Virtuoso ADE Explorer在模拟电路仿真中的核心价值与实战技巧。作为Cadence平台的专业工具,它专为高效、系统化的设计空间探索而生,能大幅提升PVT验证、参数扫描和蒙特卡洛分析的效率。文章从基础界面操作、并行仿真管理,到高级的参数扫描、数据报告生成及蒙特卡洛结果深度剖析,提供了全面的避坑指南与工作流优化建议,帮助工程师从重复劳动中解放,专注于电路设计与性能优化。

ios99的博客 898

【亲测免费】 V8Js:PHP与V8 JavaScript引擎的桥梁

V8Js 是一个开源的 PHP 扩展项目,旨在将 Google 的 V8 JavaScript 引擎嵌入到 PHP 中。该项目的主要编程语言是 C++ 和 PHP。通过 V8Js,开发者可以在 PHP 环境中执行 JavaScript 代码,从而实现 PHP 与 JavaScript 的无缝集成。 ## 项目核心功能 V8Js 的核心功能包括: 1. **JavaScript 代码执行**:...

gitblog_00897的博客 472

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4725

二十八.国民技术MCU开发之UID获取与应用

在国民NT MCU中均有一个96位和128位的唯一设备标识符,其中UCID128 位, UID 为 96 位。手册中描述的作用是:通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(SecureBootloader)。UCID 和 UID,遵守国民技术芯片序列号定义,它包含芯片生产及版本相关信息。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1676

【Node.js】深入理解 V8 JavaScript 引擎

V8 是由 Google 开发的开源 JavaScript 引擎,用 C++ 编写,最初用于 Chrome 浏览器,现在广泛用于其他项目,包括 Node.js 和 Deno。核心特点高性能:通过即时编译 (JIT) 和优化技术提升 JavaScript 执行效率。跨平台支持:运行在 Linux、Windows 和 macOS 等多个平台。多语言支持:支持 JavaScript 和 WebAssembly。

佚名程序员 2806

基于STM32、HAL库的ICP-20100气压传感器 驱动程序设计

它具有低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。#define ICP20100_FIFO_CTRL 0x09 // FIFO控制寄存器。#define ICP20100_FIFO_DATA 0x0A // FIFO数据寄存器。#define ICP20100_FIFO_STS 0x0B // FIFO状态寄存器。#define ICP20100_FIFO_WTM 0x15 // FIFO水印设置。

corlin6688的博客 599

V8Js终极指南:如何在PHP中无缝运行JavaScript代码

V8Js是一个强大的PHP扩展,它允许开发者在PHP环境中直接运行JavaScript代码。这个扩展基于Google的V8 JavaScript引擎,为PHP开发者提供了在服务器端执行JavaScript的能力,实现了PHP与JavaScript的无缝集成。无论您是想在PHP应用中嵌入前端逻辑,还是需要执行复杂的JavaScript计算,V8Js都能为您提供完美的解决方案。🚀 ## 🔧 V8

gitblog_00756的博客 905

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Node.js 入门教程 6 V8 JavaScript 引擎

Node.js 入门教程 6 V8 JavaScript 引擎

代码改变世界 668

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JavaScript、Node.js与V8的关系

对于了解Node的开发人员,我们都知道Node是基于Chrome V8引擎开发的能使JavaScript在服务器端运行的运行时环境(runtime environment)。一方面,它提供了多种可调用的API,如读写文件、网络请求、系统信息等。另一方面,因为CPU执行的是机器码,它还负责将JavaScript代码解释成机器指令序列执行,这...

weixin_34112181的博客 2638

当node脱离v8_JavaScript、Node.js与V8的关系

对于了解Node的开发人员,我们都知道Node是基于Chrome V8引擎开发的能使JavaScript在服务器端运行的运行时环境(runtime environment)。一方面,它提供了多种可调用的API,如读写文件、网络请求、系统信息等。另一方面,因为CPU执行的是机器码,它还负责将JavaScript代码解释成机器指令序列执行,这部分工作是由V8引擎完成。MotivationJavaScr...

weixin_39620278的博客 356

PyExecJS支持的8种JavaScript运行时对比:Node.js与PyV8性能测试

PyExecJS是一个能让Python直接运行JavaScript代码的强大工具,通过它开发者可以在Python环境中无缝调用JavaScript功能。然而,PyExecJS的性能表现很大程度上取决于所选择的JavaScript运行时环境。本文将深入对比PyExecJS支持的8种运行时,并重点分析Node.js与PyV8的性能差异,帮助开发者选择最适合自己项目需求的方案。 ## 一、PyExec

gitblog_00072的博客 667

java 8 js_Java 8 Nashorn JavaScript

对于 Java 中的 JavaScript 引擎, Java 8 引入了 Nashorn 来代替原先的 Rhino。Nashorn 使用 Java 7 中引入的调用动态特性,且直接编译内存中的代码并将字节码传递给 JVM。这两项改进,直接给 Nashorn 带了至少 2 到 10 倍的性能提升。jjs在 Nashorn JavaScript 引擎中。JAVA 8 引入了一个新的命令行工具 jjs,...

weixin_29522547的博客 250

探索 V8.js.cn:V8 JavaScript 引擎的中文文档与学习资源库

探索 V8.js.cn:V8 JavaScript 引擎的中文文档与学习资源库 v8.js.cnV8 官方网站中文翻译项目地址:https://gitcode.com/gh_mirrors/v8j/v8.js.cn 是一个专门为开发者打造的,关于 Google 的高性能 JavaScript 和 WebAssembly 引擎——V8 的中文文档与学习平台。这个项目旨在帮助中国的开发者更轻松地理解...

gitblog_00062的博客 830

利用v8js在php调用js代码

v8js 是 php 中的一个扩展,使用 pecl install v8js 完成安装,这里不作介绍。 看官方的几个示例 <?php class Foo { var $bar = null; } $v8 = new V8Js(); $v8->foo = new Foo; // This prints "no" $v8->executeString('print( "...

指尖跳动,代码改变生活 3322

【JS编译原理】V8执行JavaScript代码过程

文章目录前言一、编译器和解释器二、V8执行JavaScript代码过程1.引入库2.读入数据总结 前言 相信大家对Babel已经不陌生了,Babel充斥在我们代码中的每个角落。比如:jsx转化成js,es6转化成es5… 一切需要代码转化的事都可以使用babel来做,但我们有没有想过,babel是怎么去进行代码转化的呢,它转化的过程中发生了什么,让我们一起来了解一下js的编译原理吧! 一、编译器和解释器 在了解之前,我们先来理解一下编译器和解释器的概念吧。 我们知道,我们所编写的代码是不能直接被机器识别

hhhhhhhssss的博客 946

php v8js 执行外部js,利用v8js在php调用js代码

v8js 是 php 中的一个扩展,使用 pecl install v8js 完成安装,这里不作介绍。看官方的几个示例foo = new Foo;// This prints "no"$v8->executeString('print( "bar" in PHP.foo ? "yes" : "no" );');?>bar, "\n";// This prints "I'm a func...

weixin_42160278的博客 606

探秘AVR8js:在JavaScript中仿真8位微处理器!

当你想要在Web浏览器中模拟Arduino或者体验8位微控制器的运行过程时,[AVR8js](https://github.com/wokwi/avr8js)是一个值得尝试的绝佳工具。这个JavaScript库专门实现了AVR 8-bit架构,为开发者提供了一种全新的互动式学习和测试环境。 ## 项目介绍 AVR8js的核心功能是模拟Arduino所使用的ATmega328P微控制器,但其设计

gitblog_00066的博客 420

php运行js代码,使用V8js实现PHP运行Javascript代码

通过这篇文章,可以让你实现PHP运行Javascript代码,使用的是V8Js库。Windows:在Jan-E这里下载完整的编译好的PHP版本,里面有PHP全部的类库,其中就包含了V8js,下载后直接解压替换原来的php目录就可以了,这种方法是最方便的:当然你也可以从里面提取出你需要的文件,将它们解压到各自的文件夹中:\php\文件夹:v8.dllv8_libbase.dllv8_libplat...

weixin_39916520的博客 922

使用 Node.js\/D8 分析 javascript 如何被 V8 引擎优化的

排版规范:标下划线的为外部超链接,点击后面的查看原文可以点开这些链接。蓝色的为公众号内链接,点击可以直接打开。 在上一篇文章中我们讲了如何使用 GN 编译 V8 源码,文章最后编译完成的可执行文件并不是 V8,而是 D8。这篇我们讲一下如何使用 D8 调试 javascript 代码。 如果没有 d8,可以使用 node 代替。 新建文件 add-of-ints.js,输入以下内容:

justjavac的专栏 599
上一篇: JavaScript-7
下一篇: basicPython-1
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值