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

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

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

1. JavaScript 基础

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

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

  1. 作用域(Scope):
    • var 是函数作用域或全局作用域的,即使在代码块(如 for 循环或 if 语句)内部声明,它的作用域也是整个函数或全局.如果同时声明两次var也会报错。
    • letconst 是块级作用域的,意味着它们只在声明它们的代码块(如 for 循环、if 语句或任何其他类型的块)内可见。
function varTest() {var a = 10;if (true) {var b = 20; // 同一个作用域console.log(a); // 10console.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 definedconsole.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 = 'ln';
name = 'AI'; // TypeError: Assignment to constant variable.const person = { name: 'ln' };
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);
}var value = 1;
switch (value) {case 1: {let value = 'Value is 1'; // 这里的let声明了一个块作用域的新变量console.log(value);break;}case 2:console.log('Value is 2');break;default:console.log('Value is not 1 or 2');
}

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.mzph.cn/pingmian/39450.shtml

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

相关文章

前端知识点

HTML、CSS 相关 1、 BFC 1、BFC 是什么&#xff1f; BFC&#xff08;Block Formatting Context&#xff09; 格式化上下文&#xff1b; 指一个独立的渲染区域&#xff0c;或者说是一个隔离的独立容器&#xff1b;可以理解为一个独立的封闭空间。无论如何不会影响到它的外面 …

贪心+后缀和,CF 1903C - Theofanis‘ Nightmare

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1903C - Theofanis Nightmare 二、解题报告 1、思路分析 我们任意一种分组其实都是若干个后缀和相加 比如我们分成了三组&#xff0c;第一组的数被加了一次&#xff0c;第二组的数被加了两次&#xff0c;第…

JDK动态代理-AOP编程

AOPTest.java&#xff0c;相当于main函数&#xff0c;经过代理工厂出来的Hello类对象就不一样了&#xff0c;这是Proxy.newProxyInstance返回的对象&#xff0c;会hello.addUser会替换为invoke函数&#xff0c;比如这里的hello.addUser("sun", "13434");会…

ceres和eigen的cmake配置

这里的eigen是用下面安装的&#xff0c; sudo apt-get install libeigen3-devceres是编译后&#xff0c;安装到系统目录下的 sudo make install这样cmake会自动到系统下去寻找eigen, ceres相关的cmake文件&#xff0c; 包含ceres和eigen引用的源文件&#xff0c;需要在CMake…

Web3 ETF 的软件开发框架

Web3 ETF 的软件开发框架主要包含以下几个方面&#xff0c;需要说明的是&#xff0c;Web3 ETF 仍处于早期发展阶段&#xff0c;相关技术和标准尚未成熟。在开发 Web3 ETF 时&#xff0c;需要谨慎评估风险&#xff0c;并做好安全防范措施。北京木奇移动技术有限公司&#xff0c;…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

【vocabulary in use (elementary)】6 Health and Illness

very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…

Channel Messaging API 的使用

Channel Messaging API 是HTML5中引入的一种高级通信机制&#xff0c;它允许在Web Workers之间&#xff0c;以及Web Workers与主线程之间建立高效、安全的双向通信通道。这一API特别适用于需要频繁交换数据或维持长期通信的场景&#xff0c;提高了Web应用的性能和灵活性。 基础…

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区&#xff0c;是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州&#xff0c;北接密歇根州…

白骑士的Python教学高级篇 3.1 多线程与多进程

系列目录 上一篇&#xff1a;白骑士的Python教学进阶篇 2.4 高级数据结构 在现代编程中&#xff0c;提升程序性能和处理能力的常见方法之一是并发编程&#xff0c;通过同时执行多个任务来提高效率。Python中主要有两种并发方式&#xff1a;多线程和多进程。理解它们的概念、差…

数据集成面试题

Flume 一、flume组成 --Agent Flume的部署单元&#xff0c;本质上是一个JVM进程,Agent主要由Source、Channel、Sink三个部分组成 --Source 收集数据&#xff0c;以event为单元进行封装发送给channel 参数配置&#xff1a;当采集速度比较慢&#xff0c;调整batchSize参数&…

IOS Swift 从入门到精通:写入 Firestore数据库

文章目录 FirestoreManager 类创建文档更新文档更新 Firestore 权限规则现在,我们想要在 Firestore 中添加或更新文档。如果您还没有,我建议您阅读有关设置 Firebase Auth 和从 Firestore 读取的部分。您必须在应用程序中启用 Firebase,并在项目中启用 Firestore 数据库,才…

【IT专业入门,高考假期预习指南】高考后的IT征途:启航前的准备与策略

IT专业入门&#xff0c;高考假期预习指南 七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为该领域的前行者和经验前辈&a…

Java中的分布式事务管理

Java中的分布式事务管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的分布式事务管理&#xff0c;这是在现代大规模应用中必须解决…

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…

Python协作运动机器人刚体力学解耦模型

&#x1f3af;要点 &#x1f3af;腿式或固定式机器人模型 | &#x1f3af;网格、点云和体素网格碰撞检测 | &#x1f3af;正反向运动学和动力学 | &#x1f3af;机器人刚体力学计算 | &#x1f3af;编辑参考系姿势和路径 | &#x1f3af;软件接口实体机器人模拟 | &#x1f3a…

使用shell脚本进行clang-tidy静态代码分析

文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言 clang-tidy 是基于 Clang 的工具&#xff0c;提供了丰富的代码检查功能&#xff0c;可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang…

分子AI预测赛Task2笔记

下面所述比较官方的内容都来自官方文档 ‍‌⁠‌‍​​​‌​​⁠​​​​​&#xfeff;​​​&#xfeff;‍‬​​‍⁠‍‍​​‬​&#xfeff;‌​​​‌‍‬​​​​​​‍‌Task2&#xff1a;赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…

WebDriver API

WebDriver API 是一组允许程序控制和自动化Web浏览器的接口&#xff0c;它是Selenium框架的一部分。Selenium 是一个广泛使用的开源自动化测试工具&#xff0c;用于Web应用程序的自动化测试。WebDriver API 提供了与浏览器进行交互的能力&#xff0c;支持多种浏览器&#xff0c…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了&#xff0c;有什么方法可以恢复吗&am…