基础不牢地动山摇:JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用——干货语法大全

基础不牢地动山摇:JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用——语法大全

JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用,偏门基础用法语法知道的越多,理解的越深刻,运用的越灵活才能赢。

1. JavaScript 基础

1.1 语法和数据类型letvarconst 的区别

JavaScript 的数据类型是理解变量和操作的基础。
letvarconst 是 JavaScript 中用于变量声明的关键字,它们之间有几个关键的区别:

  1. 作用域(Scope):
    • var 是函数作用域或全局作用域的,即使在代码块(如 for 循环或 if 语句)内部声明,它的作用域也是整个函数或全局。
    • letconst 是块级作用域的,意味着它们只在声明它们的代码块(如 for 循环、if 语句或任何其他类型的块)内可见。
function varTest() {
  var a = 10;
  if (true) {
    var b = 20; // 同一个作用域
    console.log(a); // 10
    console.log(b); // 20
  }
  console.log(b); // ReferenceError: b is not defined
}

function letTest() {
  let a = 10;
  if (true) {
    let b = 20; // 不同的作用域
    console.log(a); // ReferenceError: a is not defined
    console.log(b); // 20
  }
  console.log(a); // a is not defined
}
  1. 可变性(Mutability):
    • varlet 允许变量重新赋值。
    • const 声明的变量是不可变的,这意味着你不能重新分配新的值给这个变量,但如果你声明的是一个对象或数组,你可以修改对象的属性或数组的元素。
var message = 'Hello';
message = 'Hi'; // 允许重新赋值

let count = 1;
count = 2; // 允许重新赋值

const name = 'Kimi';
name = 'AI'; // TypeError: Assignment to constant variable.

const person = { name: 'Kimi' };
person.name = 'AI'; // 允许修改对象的属性
  1. 全局对象属性(Global Object Property):
    • 使用 var 在全局作用域声明的变量会成为全局对象的属性(在浏览器中是 window 对象)。
    • 使用 letconst 在全局作用域声明的变量不会成为全局对象的属性。
var globalVar = 'I am a global variable';
console.log(window.globalVar); // 'I am a global variable'

let globalLet = 'I am not a global object property';
console.log(window.globalLet); // undefined
  1. 提升(Hoisting):
    • var 声明会被提升到它们所在作用域的顶部,但初始化不会被提升。
    • letconst 声明也会被提升,但它们不会被初始化,直到它们被明确声明。这意味着在声明之前访问这些变量会抛出一个 ReferenceError
console.log(varTest); // undefined (只提升了声明)
var varTest = 10;

console.log(letTest); // ReferenceError: Cannot access 'letTest' before initialization
let letTest = 20;

console.log(constTest); // ReferenceError: Cannot access 'constTest' before initialization
const constTest = 30;

了解这些区别对于编写可维护和清晰的 JavaScript 代码至关重要。通常推荐使用 letconst 来声明变量,因为它们提供了块级作用域,有助于避免意外的作用域问题。使用 const 可以保证变量不可变性,有助于减少错误。

1.2 操作符和表达式

操作符是执行程序逻辑和计算的构建块。

// 算术运算
let total = 5 + 3;

// 字符串连接
let greeting = 'Hello, ' + name + '!';

// 逻辑运算
let isApproved = isDebugging && count > 5;
1.3 控制流

控制流语句控制程序的执行顺序。

// if...else 语句
if (count > 0) {
  console.log('Count is positive.');
} else {
  console.log('Count is not positive.');
}

// for 循环
for (let i = 0; i < numbers.length; i++) {
  console.log(numbers[i]);
}

// break 和 continue
for (let i = 0; i < 10; i++) {
  if (i === 5) break;
  if (i % 2 === 0) continue;
  console.log(i);
}

2. 函数和作用域

2.1 函数定义和调用

函数是封装代码以供重复使用的结构。


// 函数表达式
const sayGoodbye = function(name) {
  console.log(`Goodbye, ${name}!`);
};

2.2 自执行函数

自执行函数(Immediately Invoked Function Expression,简称IIFE)是一种在定义后立即执行的JavaScript函数表达式。这种模式有几个关键特点:

  1. 匿名性:自执行函数通常是匿名的,这意味着它们没有名字。
  2. 立即执行:函数定义后会立即执行,不需要显式调用。
  3. 作用域限制:自执行函数提供了一个独立的作用域,有助于避免污染全局命名空间。

无参数的自执行函数

(function() {
  console.log('This is an IIFE.');
})();

带参数的自执行函数

自执行函数也可以接受参数:

(function(greeting) {
  console.log(greeting);
})('Hello, IIFE!');

为什么使用自执行函数

  1. 避免命名冲突:自执行函数是匿名的,可以避免命名冲突。
  2. 创建局部变量:自执行函数允许在其中声明局部变量,这些变量在函数外部不可访问。
  3. 模块模式:自执行函数可以用于JavaScript模块模式,以保持代码的封装性。
  4. 控制执行时机:立即执行的特性使得自执行函数非常适合用于初始化代码。

模块模式

自执行函数经常用于JavaScript模块模式,以提供私有作用域:

const myModule = (function() {
  const privateVar = 'I am private';

  return {
    publicMethod: function() {
      console.log('Accessing private variable:', privateVar);
    }
  };
})();

myModule.publicMethod(); // 'Accessing private variable: I am private'

在上面的例子中,privateVar 是一个私有变量,只能在自执行函数内部访问,而 publicMethod 是公共接口的一部分,可以从外部调用。

避免全局变量

自执行函数可以避免创建全局变量:

(function() {
  let localVar = 'I am local to this IIFE';
})();

console.log(localVar); // ReferenceError: localVar is not defined
箭头函数

自执行函数同样可以使用箭头函数的语法:


// 箭头函数
const greet = (name) => `Hello, ${name}!`;

(() => {
  console.log('Arrow function IIFE.');
})();
2.2 闭包和高阶函数

闭包提供了一种保护变量作用域的方式,而高阶函数可以接受或返回函数。

// 闭包
function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const addFive = makeAdder(5);
console.log(addFive(3)); // 8

// 高阶函数
function map(numbers, func) {
  return numbers.map(n => func(n));
}

const squares = map(numbers, n => n * n);
console.log(squares);

3. 对象和原型链

3.1 对象字面量和原型

对象是属性和方法的集合,原型链是 JavaScript 继承的核心。

// 对象字面量
let car = {
  brand: 'Tesla',
  model: 'Model S',
  start: function() {
    console.log(`${this.model} is starting.`);
  }
};

car.start(); // 'Model S is starting.'

// 原型链
function Vehicle(make, model) {
  this.make = make;
  this.model = model;
}

Vehicle.prototype.displayInfo = function() {
  console.log(`Make: ${this.make}, Model: ${this.model}`);
};

let myCar = new Vehicle('Tesla', 'Model S');
myCar.displayInfo(); // 'Make: Tesla, Model: Model S'
3.2 构造函数和 new

构造函数用于创建特定类型的对象实例。

// 构造函数
function Animal(species, sound) {
  this.species = species;
  this.sound = sound;
}

Animal.prototype.makeSound = function() {
  console.log(`${this.species} says ${this.sound}.`);
};

let dog = new Animal('Dog', 'Bark');
dog.makeSound(); // 'Dog says Bark.'

4. 异步编程

4.1 回调函数

回调函数是异步编程的基础,用于处理完成的异步操作。

// 回调函数
function onSuccess(data) {
  console.log('Data received:', data);
}

function onDataReceived(error, data) {
  if (error) throw error;
  onSuccess(data);
}

// 模拟异步数据接收
setTimeout(() => onDataReceived(null, { info: 'asynchronous data' }), 1000);
4.2 Promises 和 Async/Await

Promises 提供了一种更优雅的异步编程方式,而 async/await 进一步简化了代码。

// Promises
const delayedData = new Promise((resolve) => {
  setTimeout(() => resolve('Promise data'), 1000);
});

delayedData.then(onSuccess).catch(error => console.error(error));

// Async/Await
async function fetchData() {
  try {
    const data = await delayedData;
    console.log('Fetched data:', data);
  } catch (error) {
    console.error(error);
  }
}

fetchData();

5. 模块和作用域

5.1 CommonJS 和 ES6 Modules

模块化是现代 JavaScript 开发的关键部分,它帮助我们组织和管理代码。

// CommonJS 模块
const myUtils = require('./utils');
myUtils.doSomething();

// ES6 模块
import { doSomething } from './utils';
doSomething();

结论

JavaScript 逆向工程要求我们不仅要理解语言的表面语法,还要深入到语言的内部机制。掌握从基础语法到高级概念的知识,是每个逆向工程师的必备技能。通过不断学习和实践,我们可以提高自己的技术水平,更好地应对各种代码挑战。

注意

本文提供的代码示例仅用于教育目的,不应用于任何非法逆向工程活动。请确保在进行逆向工程时遵守相关法律法规。

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

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

相关文章

软件测试之接口测试(Postman/Jmeter)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比如你需要从别的系统来…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-29残差网络ResNet

29残差网络ResNet import torch from torch import nn from torch.nn import functional as F import liliPytorch as lp import matplotlib.pyplot as plt# 定义一个继承自nn.Module的残差块类 class Residual(nn.Module):def __init__(self, input_channels, num_chan…

AI副业赚钱攻略:掌握数字时代的机会

前言 最近国产大模型纷纷上线&#xff0c;飞入寻常百姓家。AI副业正成为许多人寻找额外收入的途径。无论您是想提高家庭收入还是寻求职业发展&#xff0c;这里有一个变现&#xff0c;帮助您掌握AI兼职副业的机会。 1. 了解AI的基础知识 在开始之前&#xff0c;了解AI的基础…

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的&#xff0c;因此 Srping …

zabbix监控进阶:如何分时段设置不同告警阈值(多阈值告警)

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;乐乐 在生产环境中&#xff0c;企业的业务系统状态并不是一成不变的。在业务高峰时段&#xff0c;如节假日、促销活动或特定时间段&#xff0c;系统负载和用户访问量会大幅增加&#xff0c;此时可能需要设置更高的告警阈值…

vscode 使用正则将/deep/ 替换成 :deep()

在VSCODE编辑器的SEARCH中按上图书写即可&#xff0c;正则表达式如下&#xff1a;(\/deep\/)(.*?)(?\{) 替换操作如下&#xff1a;:deep($2) 如果有用,号隔开的用&#xff1a;(\/deep\/)(.*?)(?,)替换操作如下&#xff1a;:deep($2) 即可实现快速替换所有/deep/写法; 同理…

Cyuyanzhong的内存函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、memcpy函数的使用与模拟实现二、memmove函数的使用和模拟实现三、memset函数与memcmp函数的使用&#xff08;一&#xff09;、memset函数&#xff08;内存块…

一文速览Google的Gemma:从gemma1到gemma2

前言 如此文《七月论文审稿GPT第3.2版和第3.5版&#xff1a;通过paper-review数据集分别微调Mistral、gemma》所讲 Google作为曾经的AI老大&#xff0c;我司自然紧密关注&#xff0c;所以当Google总算开源了一个gemma 7b&#xff0c;作为有技术追求、技术信仰的我司&#xff0…

大模型ReAct:思考与工具协同完成复杂任务推理

ReAct: Synergizing Reasoning and Acting in Language Models Github&#xff1a;https://github.com/ysymyth/ReAct 一、动机 人类的认知通常具备一定的自我调节&#xff08;self-regulation&#xff09;和策略制定&#xff08;strategization&#xff09;的能力&#xff0…

福昕阅读器再打开PDF文件时,总是单页显示,如何设置打开后就自动显示单页连续的模式呢

希望默认进入连续模式 设置方法 参考链接 如何设置使福昕阅读器每次启动时不是阅读模式 每次启动后都要退出阅读模式 麻烦_百度知道 (baidu.com)https://zhidao.baidu.com/question/346796551.html#:~:text%E5%9C%A8%E3%80%90%E5%B7%A5%E5%85%B7%E3%80%91%E9%87%8C%E6%9C%89%E…

Springboot下使用Redis管道(pipeline)进行批量操作

之前有业务场景需要批量插入数据到Redis中&#xff0c;做的过程中也有一些感悟&#xff0c;因此记录下来&#xff0c;以防忘记。下面的内容会涉及到 分别使用for、管道处理批量操作&#xff0c;比较其所花费时间。 分别使用RedisCallback、SessionCallback进行Redis pipeline …

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中&#xff0c;安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目&#xff0c;用于提供安全访问控制的功能。通过集成Spring Security&#xff0c;我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…

昇思25天学习打卡营第11天|基于MindSpore通过GPT实现情感分类

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninsta…

Mysql常用SQL:日期转换成周_DAYOFWEEK(date)

有时候需要将查询出来的日期转换成周几&#xff0c;Mysql本身语法就是支持这种转换的&#xff0c;就是DAYOFWEEK()函数 语法格式&#xff1a;DAYOFWEEK(date) &#xff08;date&#xff1a;可以是指定的具体日期&#xff08; 如2024-06-29 &#xff09;&#xff0c;也可以是日期…

一个项目学习IOS开发---创建一个IOS开发项目

前提&#xff1a; 由于IOS开发只能在MacOS上开发&#xff0c;所以黑苹果或者购买一台MacBook Pro是每个IOS开发者必备的技能或者工具之一 Swift开发工具一般使用MacOS提供的Xcode开发工具 首先Mac Store下载Xcode工具 安装之后打开会提醒你安装IOS的SDK&#xff0c;安装好之…

媒体宣发套餐的概述及推广方法-华媒舍

在今天的数字化时代&#xff0c;对于产品和服务的宣传已经变得不可或缺。媒体宣发套餐作为一种高效的宣传方式&#xff0c;在帮助企业塑造品牌形象、扩大影响力方面扮演着重要角色。本文将揭秘媒体宣发套餐&#xff0c;为您呈现一条通往成功的路。 1. 媒体宣发套餐的概述 媒体…

使用Tailwindcss之后,vxe-table表头排序箭头高亮消失的问题解决

环境 vue2.7.8 vxe-table3.5.9 tailwindcss/postcss7-compat2.2.17 postcss7.0.39 autoprefixer9.8.8 问题 vxe-table 表格表头 th 的排序箭头在开启正序或逆序排序时&#xff0c;会显示蓝色高亮来提示用户表格数据处在排序情况下。在项目开启运行了tailwindcss之后&#xff0…

Kafka入门-基础概念及参数

一、Kafka术语 Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与订阅解决方案。可以为每个业务、每个应用甚至是每类数据都创建专属的主题。 Kafka的服务器端由被称为Broker的服务进程构成&#xff0c;即一个Kafka集群由多个Broker组成&#…

dledger原理源码分析系列(二)-心跳

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的心跳 关键词 Raft Openmessaging 心跳/…

Android14之RRO资源文件替换策略(二百二十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…
最新文章