javaScript深度解析(1)--作用域

JavaScript 闭包与作用域的深度解析 作用域是指变量和函数的可访问范围。在 JavaScript 中,主要有全局作用域和局部作用域。全局作用域:在代码的任何地方都可以访问到的变量和函数,通常在脚本的最外层或通过全局对象(如 window)定义的变量和函数都处于全局作用域中。// 全局变量} // 全局函数在这个例子中,globalVar 和 globalFunc 都可以在代码的任何地方被访问和调用。局部作用域:在函数内部定义的变量和函数,只能在函数内部访问,外部无法访问。 阅读详情

作用域

若要转载,请著名出处。

编程语言最基本的功能就是存储变量中的值,并可以对其进行修改。

为了能够存储变量,并找到它们,就需要一套严密的规则,这套规则其实

就是作用域。

让我们先了解一下编译原理

javaScript(文章以后都简称js),其实是一门编译语言。毋庸置疑。

编译的大致过程如下:

1.   分词/词法分析(Tokenizing/Lexing)

可以理解成拆分,把代码块拆分成约定好的词块。
比如: var a = 2 ; ,分词大致会分为var 、a 、=、2、;。

2.   解析/语法分析(Parsing)

分词之后的流(数组)在这一过程被构造成抽象语法树(AST)。
AST的各个节点描述了该拆分代码的信息

3.   代码生成

这一过程就是将AST转换成可执行的代码的过程。

这里只是简单的将编译过程做了阐述,实际过程远远复杂甚之。

理解作用域

作用域

负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套严密的规则,确定当前执行的代码对这些标识符的访问权限。

var a = 2 ;

我们再看看这个简单的列子,简单的分为声明和赋值两个模块解析:
1.   声明   编译器会在作用域中寻找是否有这个声明存在,没有,作用域就会再当前的作用域集合中声明一个变量,并命名为a,有,则继续编译。
2.  赋值    编译器生成赋值代码,引擎执行这段代码的时候会在作用域中寻找是否有a这个变量,有,直接用它,没有,继续寻找。

引擎如何查找变量?

这里简单的介绍两种查找方法

1.  LHS

可以简单理解就是赋值操作左侧的变量,虽然不准确,概念上最好理解为找到赋值操作的目标是谁?

2.  RHS

可以简单理解就是赋值操作右侧的变量,谁是赋值操作的源头?

为了便于理解我们给个小demo:

function foo(a){
    console.log(a); //2
}
foo(2);

这里foo(…) 是RHS查询
隐式的将2赋值给a是LHS
console.log(…)是RHS

作用域嵌套

当一个模块或函数和另一个模块或函数发生重叠嵌套的时候,作用域也嵌套,此时引擎的查找顺序则是从当前作用域开始,逐渐向外层拓展,直到最外层的全局作用域,此时无论找到与否,查找都会停止。
区分两种异常
1.   ReferenceError  作用域判别失败
2.   TypeError   作用域是判别对了,但是对结果的操作是不合法的。

作用域与作用域链深度解析 全局作用域:整个程序可访问函数作用域:函数内部可访问{}内可访问(ES6+)变量查找规则:当前作用域 → 父作用域 → … → 全局作用域在函数定义时确定(词法作用域)函数 + 其词法环境允许访问定义时的作用域注意内存管理4、ES6 增强:块级作用域暂时性死区(TDZ)模块作用域避免全局污染优先使用块级作用域缓存外部变量合理使用闭包。 阅读详情

相关推荐

【高频考点精讲】闭包与作用域链的深度解析:从变量提升到块级作用域,掌握JS执行机制

写出更可靠的代码避免常见陷阱设计更优雅的架构轻松应对相关面试题最后留个思考题:如何用闭包实现一个只能调用一次的函数?欢迎在评论区分享你的实现,全栈老李会挑选有趣的做法进行解析。

全栈老李的博客 782

javaScript深度剖析

函数式编程 柯里化 函数组合 函子

weixin_53800968的博客 414

【高频考点精讲】作用域链是如何形成的?深度解析JavaScript中的作用域链查找机制

作用域链是在函数定义时就确定好的,而不是调用时。这就是JavaScript的“词法作用域”(Lexical Scope)特性。来看个经典例子:const name = '全栈老李';// 全栈老李:全局变量const name = '隔壁老王';// 全栈老李:遮蔽了全局变量sayName();// 猜猜输出什么?wrapper();// 输出"全栈老李"还是"隔壁老王"?答案是"全栈老李"!因为sayName函数定义在全局,它的作用域链只包含全局作用域,即使你在wrapper。

全栈老李的博客 685

Javascript 对象深度解析

对象-高程及月影js视频学习笔记 对象的深拷贝和浅拷贝 ES5 浅拷贝 Object.assign({}, conf) 只能拷贝一级,深层的源改变,目标也会跟着改变。 递归 深拷贝 function deepCopy(des, src) { for (var key in src) { if(typeof src[key] !== 'object') { ...

KateCateCake的博客 711

JSBridge深度剖析

概述做过混合开发的人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包装一层Native,然后通过Bridge技术的js调用本地的库。在讲JSBridge技术之前,我们来看一下传统的实现方式。Android端Native调JSnative调用js比较简单,只要遵循:”javascript: 方法名(‘参数,需要转为字符串’)”的规则即可。在4.4之前,调用的方式:// mWebV

xiangzhihong8的专栏 2万+

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1859

嗨,你真的懂this吗?

this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JavaScript开发者并不是非常清楚它究竟指向的是什么。听说你很懂this,是真的吗?请先回答第一个问题:如何准确判断this指向的是什么?【面试的高频问题】再看一道题,控制台打印出来的值是什么?【浏览器运行环境】var number = 5;var obj = { n...

cpongo011702 485

MATLAB自动驾驶(1)——预构建场景库

MATLAB自动驾驶(1)——预构建场景库

Ucicorn Gundam的博客 3265

JS的引擎深入分析-转载

浏览器的组成JavaScript代码嵌入网页的方法直接添加代码块加载外部脚本行内代码标签的工作原理defer属性async属性重流和重绘脚本的动态嵌入加载使用的协议JavaScript虚拟机单线程模型含义消息队列Event Loop参考链接 浏览器的组成 浏览器的核心是两部分:渲染引擎和JavaScript解释器(又称JavaScript引擎)。 (1)渲染引擎 渲

xygg0801的博客 4959

无人机频谱侦测与智能识别技术实战解析

本文深入解析无人机频谱侦测与智能识别技术实战应用,涵盖无线电侦测、信号处理和定位技术等核心内容。通过频谱分析、特征提取和机器学习算法优化,实现高精度无人机识别与定位,并分享复杂环境下的应对策略和系统集成经验。

weixin_28419039的博客 487

脑电信号处理实战 01 | 从 0 跑通第一个 EEG 分析:加载、滤波、频谱与“睁眼闭眼“

本文以 UCI 公开数据集"EEG Eye State"为例,从零走通脑电处理的完整流水线——数据加载、1–40 Hz 带通滤波、Welch 功率谱、频带功率、通道相关性与箱线图质控、睁闭眼对比和时频分析,并用 8 张科研风格图层层揭示这份数据中的伪迹与通道重复问题,说明"流程跑得通不等于结果可信,质量控制永远先行"。

qq_53529450的博客 112

JavaScript——作用域和预解析,深度理解代码执行程序

js作用域和预解析,深度理解代码执行程序,让你理解的更透彻,以及最后附上一个小练习,可以思考一下,并总结这篇所有的内容

zhaochen1127的博客 3514

YOLO11优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

我们提出金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块,通过由粗到细的 token 选择机制和共享注意力参数,在大幅降低计算量的同时保留空间细节。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1061

JavaScript深度理解——作用域

正确理解JS作用域有助你更好的理解这门语言的精髓。存储和访问变量,是任何一种编程语言最基本的功能之一,变量存在哪里?程序需要时如何找到它?这些问题需要一套良好的规则来规范,这套规则,就叫做作用域。

qq_41497756的博客 2344

Windows11安装配置openclaw+deepseek(大龙虾)

密码可以随便设置(注意wsl系统本质上是linux系统,设置密码系统是不会像windows一样显示*点位符的),输入密码后敲回车再次输入密码,输入后敲回车。如果不小心关闭这个界面,可以再次进入powershell,输入wsl进行系统。在powershell中输入:curl -fssL https://openclaw.ai/install.sh | bash。下面是否通过第3方平台和openclaw交互,我选择j最后一项:skip for now。到下面这一步,可以通过键盘的左箭头选择Yes.

mahailiang的专栏 343

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 232

JavaScript 作用域与作用域链:深度解析

作用域是一个上下文环境,它决定了代码中的变量和函数在哪些地方是可访问的。全局作用域(Global Scope):当变量或函数在全局范围内定义时,它们就属于全局作用域,意味着它们可以在任何地方访问。局部作用域(Local Scope):局部作用域通常指的是函数内部的作用域。每当一个函数被调用时,它会创建一个新的局部作用域,这个作用域中的变量只在该函数内部有效。作用域链(Scope Chain)是一个由多个作用域组成的链式结构,它决定了在某个上下文中,变量如何被查找。

m0_62599305的博客 1245

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《前端面试题:JavaScript 作用域深度解析》

JavaScript作用域核心概念解析 本文深入剖析JavaScript作用域机制,主要涵盖以下要点:作用域类型:全局作用域、函数作用域、块级作用域(ES6 let/const引入) 变量声明差异:var存在变量提升且为函数作用域,let/const为块级作用域且有暂时性死区 作用域链:变量查找从当前作用域向外层逐级查找,直至全局作用域 闭包原理:函数能记住并访问其词法作用域的特性 典型面试题:包括变量提升、循环中闭包应用、TDZ等常见考点 最佳实践:推荐使用let/const,避免全局污染,合理应用闭包。

前端码农的博客 1289

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JavaScript 作用域与作用域链深度解析

作用域是变量的可访问范围,由代码结构静态决定。作用域链是变量查找的路径,基于函数定义时的词法环境。闭包通过保留作用域链,实现跨作用域访问变量。

七公子77的技术博客 863

吃透 JS 核心:作用域、this 指针与闭包的深度解析

本文深入解析JavaScript三大核心概念:作用域、this指针和闭包。作用域分为全局、函数和块级作用域,涉及变量提升与作用域链机制;this指针根据调用方式动态绑定,包括new、显式、隐式、默认绑定及箭头函数特性;闭包通过内层函数引用外层变量实现数据封装,需注意内存泄漏问题。掌握这些底层机制能提升代码质量,解决90%的面试难题。建议结合实战案例强化理解,将理论转化为编程直觉。

一位搞嵌入式和前端的genius的博客 729

深度解析 JavaScript 作用域与作用域链

理解了 JavaScript 的作用域和作用域链对我们理解闭包、模块化、高阶函数等特性能够有更好的帮助,也能让我们在实际开发中,更合理运用块级作用域(let/const)、模块化(ES Module),规避变量污染、逻辑混乱等问题,写出更健壮、可扩展的 JavaScript 代码。

专注前端领域方向的内容 576

JavaScript 作用域:从概念到底层原理的深度解析

JavaScript 作用域是变量和函数的可访问范围,分为全局、函数和块级作用域。作用域链决定了变量查找路径,遵循就近原则。变量提升机制中,函数声明整体提升,var 声明的变量提升但未赋值,let/const 存在暂时性死区。执行上下文通过作用域链管理变量访问。闭包利用作用域链保持对外部变量的引用。最佳实践建议使用块级作用域、避免全局污染。理解作用域机制有助于编写健壮代码,是进阶高级开发的关键。

你若盛开,清风自来 1061

深度解析JS作用域链

作用域链 当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。(JavaScript深入之作用域链) (1) 函数作用域 先看一小段代码: var scope="global"; function t(){ console.log(scope); var scope="local" console.log(sco..

qq_38261819的博客 230

HoRain云--深度解析 JavaScript 作用域与作用域链

本文深入解析了JavaScript的作用域和作用域链机制。作用域分为全局作用域、函数作用域和块级作用域,决定了变量的可访问范围。作用域链是由当前作用域及其外层作用域组成的链表,用于变量查找。文章详细介绍了作用域链的构建过程、变量查找规则,以及闭包、变量遮蔽等典型应用场景。同时指出了变量提升和全局作用域污染等常见问题,强调理解这些概念对掌握闭包、模块化等特性的重要性,有助于编写更健壮的代码。通过词法作用域和静态作用域的特性分析,帮助开发者规避变量污染等问题,提升代码可维护性。

sinat_57153473的博客 998

JavaScript函数与作用域深度解析:Frontend Masters Bootcamp 核心概念

Frontend Masters Bootcamp 是前端开发者的入门宝典,其中 JavaScript 函数与作用域是构建高效代码的核心基石。本文将通过实例解析函数的定义与调用方法,揭示作用域的工作原理,帮助你写出更具可维护性的前端代码。 ## 函数:JavaScript 的代码积木 🧱 函数是 JavaScript 中最基本的代码复用单元,就像 CSS 类一样可以被反复调用。在 Front

gitblog_00663的博客 918
上一篇: google拓展应用
下一篇: 目前最好用的文件上传工具plupload演示
波比小金刚
博客等级 码龄11年 41粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值