详解js变量声明提升

【26JavaScript声明提升】JavaScript声明提升:变量和函数的神秘提前现象,详解作用域中的变量声明和函数声明提升现象,助您轻松理解代码执行顺序。 在 JavaScript 中,变量和函数声明会被提升到当前作用域的顶部。这意味着可以在声明之前使用这些变量和函数。 阅读详情

之前一直觉会认为javascript代码执行是由上到下一行行执行的。自从看了《你不知道的JS》后发现这个观点并不完全正确。先来给大家举一个书本上的的例子:

  var a='hello world';
  var a;
  console.log(a); 

一开始我觉得输出的是undefined。但是真正的结果是hello world。带着疑问再看另外一段代码:

console.log(a);
var a='hello world';

借鉴与上面的例子会认为会输出一个hello world,或者是抛出一个没有声明的异常错误,然而发现这两种想法也是错误。输出的结果是‘undefined’。这书非常人性化的总结出了结论是:

引擎解释javascript代码的之前会对其进行编译。在编译过程中会查找所有声明,并用合适作用域将他们关联起来。换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。所以,当遇到var a=’hello world’中是 var a是先在编译阶段执行,然后在执行a=’hello world’。所以,第一段代码实质上是:

var a;
a='hello world';
console.log(a);

所以输出的就就是helloworld。总结一句话就是:只有声明被提升,而赋值或其他运算会留在原地。所以第二段代码实际上就是:

var a;
console.log(a);
a='hello world';

介绍完这两个经典例子是时候来看看一下这个例子了:

var name = "world";
(function () {
    if (typeof name == 'undefined') {
        var name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

根据javascript的运行机制和javascript没有块作用域这个特点,可以得出,变量name会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的。所以上述代码就相当于:

var name = "world";
(function () {
    var name;
    if (typeof name == 'undefined') {
        var name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

因此,if判断的时候typeof name == ‘undefined’是true。所以会执行条件为true里面的代码。输出就是Hello yang。
那么如果想实现上面的函数,我们该如何实现?答案非常简单那就创建块作用域了。如何最简单的创建块作用域呢?那当然是采用es6的新特性let关键字。let关键字可以将变量绑定到所在的任意区域中通常在{…}中。

换句话说。let为其声明变量隐性劫持到所在区域中。下列例子中:let就绑定到if (typeof name == ‘undefined’) {…}中。所以name不会被提升,所以判断就为假,于是就可以输出我们期待已久的‘helloworld’。

var name = "world";
(function () {
    if (typeof name == 'undefined') {
        let name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

注意点:let所在的块级作用域,在声明代码被运行前,是不会像var那样会被查找到,提前声明,而是运行到了该代码才会被声明执行。下面例子很好说明这个问题:

(function (){
    console.log(b);
    let b=2;
})()

本文来源《详解js变量声明提升》

弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】 本文实例讲述了弱类型语言javascript开发中的一些坑。分享给大家供大家参考,具体如下: 测试1: (未声明变量自动提升为全局变量) test1(); function test1() { function setName() { name = '张三'; // 此处没有var声明,提升至全局 } setName(); console.log(name);// '张三' } 测试2: (函数内部局部变量的变量提升) test2(); function test2() { var a = 1; function haha() { console. 立即下载

相关推荐

ORCAD 层次化原理图使用TCL获取位号的方法

orcad tcl 获取occurrence位号的方法。

m0_46675718的博客 1132

var name = ‘World!‘; (function () {if (typeof name === ‘undefined‘) {...一道关于变量提升的面试题

ar name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); 在 JavaScript中, Fun 和 var 会被提升 相当于 var name = '.

微光的博客 5466

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 537

一道关于作用域的题

函数作用域练习题

qq_44701728的博客 249

【Sentaurus TCAD仿真】几种基础操作

当内存不足时,没必要删除整个Project,只需要 Clean up 节点信息即可。因为占用内存的主要部分是。文件数据,Command文件是不占用多少内存的,下次需要此工程仿真结果重新运行即可。右击可以对该工程进行剪切、复制、删除、重命名等操作。当节点号有时候排序混乱的时候,我们需要重新编排节点号。此时左侧工具栏就能看见我们新建的这个工程。运行节点时不同的颜色代表目前的状态。在这个地方添加要使用的工具。这个时候需要的工具就建好了。然后选择需要使用的工具。我们需要保存这个工程。

qq_45746744的博客 1万+

脑机接口最新发展动态报告 (2024-2025)

脑机接口动态

高山 4106

来一份前端笔试题吗

一步一步来 先将每一个题目放置在此,往下可以查看问题答案 1、一个函数如何获取他的参数 2、如何合并两个对象 3、JS类型判断 typeof NaN / undefined == false / 1 + undefined 4、用闭包的方式实现一个计数器,可以传入一个参数数值,返回从头输入到结束所有的数值之和 5、题目如下 let a = 1 function b(a) { a = 2 console.log(a) } b(a) console.log(a) 6、题目如下 let a = b =

GonTinyBlack的博客 1172

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间

lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很...

weixin_39669629的博客 1万+

经典面试题(16):以下代码将输出的结果是什么?

继续我们的经典面试题,前两篇在码字上注意力有些许不集中,出现了错误,再次对大家表示抱歉。而今天这道题主要考察的是JavaScript中生僻冷门用法和容易忽视混淆的概念,据...

qq_24520459的博客 820

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 162

基于深度学习的柠檬等级检测系统 —— YOLOv8 + UI界面 + 数据集

本项目的目标是构建一个柠檬等级检测系统,通过深度学习模型自动检测柠檬的等级。自动检测柠檬等级:通过图像中的柠檬特征,自动判断其成熟度和质量。实时视频检测:通过摄像头实时监控柠檬的质量等级。用户友好的UI界面:为用户提供简洁直观的操作界面,支持图像上传、实时视频检测等功能。本项目展示了如何基于YOLOv8模型开发一个柠檬等级检测系统,结合PyQt5实现了用户友好的UI界面。通过该系统,用户可以快速上传柠檬图像并自动识别其等级,极大提升了检测效率和准确性。数据集的扩展。

YOLO 1112

查漏补缺(十二)

查漏补缺(十二)

weixin_45393020的博客 270

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 661

php 执行平台,js运行平台搭建等

一、vscode运行JS平台搭建:1、官网下载node.js 并安装 ; 2、在vscode安装插件code runner二、声明变量的方法:1、变量名或赋值语句前加上 var ,例如 var $name , var _name,var name,var name=10;2、注意变量名称一样,单大小写不一样,为两个不同的变量。例如: var name 和 var Name 为不同的变量。3、:...

weixin_42513814的博客 148

深度学习工具包 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")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JavaScript

文章目录JavaScript 构成JS文件延迟和异步加载:defer和async属性JavaScript代码块(代码段)基本语法区分大小写直接量转义序列标识符关键字保留字空白符(分隔符)转义字符声明变量变量提升。JavaScript变量污染基本数据类型typeof运算符知识点 JavaScript 构成 实际上,一个完整的 JavaScript 实现由以下 3 个不同部分组成: 核心(ECMAScript):语言核心部分。 文档对象模型(Document Object Model,DOM):网页文档操作标

惊鸿的技术博客 649

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

javascript 的预编译过程

javascript 的预编译过程 JS 运行三部曲 1、语法解析 (分析是否有语法错误) 2、预编译(全局 和 函数体内) 3、解释运行(除了预编译过的,一行一行运行) 预编译前奏 1、暗示全局变量(任何变量,如果未经声明就赋值,此变量就是全局变量,函数体内也不例外) 例如:a=123; 这个变量a就是全局变量 一切声明的全局变量,全是window的属性 例如:a=123;就等于window.a...

weixin_45892086的博客 252

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

终极idiomatic.js代码审查宝典:快速识别和修复JavaScript代码风格问题

idiomatic.js是一个专注于编写一致、地道JavaScript代码的开源项目,它提供了一套全面的代码风格指南,帮助开发者遵循最佳实践,提升代码质量和可维护性。无论是新手还是有经验的开发者,掌握idiomatic.js的规范都能让你的JavaScript代码更加专业、易读且高效。 ## 为什么代码风格一致性至关重要? 在软件开发中,代码风格的一致性往往被低估,但它却是影响项目成功的关键因

gitblog_00697的博客 819

2025终极Node.js代码规范指南:Airbnb风格最佳实践详解

在现代Node.js开发中,代码规范是团队协作和项目可维护性的基石。Airbnb JavaScript Style Guide作为业界最受欢迎的代码规范之一,通过清晰的规则和最佳实践帮助开发者编写高质量代码。本文将深入解析Airbnb规范的核心要点,带你掌握从环境配置到高级模式的完整实践方案,让你的Node.js项目代码更规范、更易读、更可靠。 ## 为什么选择Airbnb代码规范? Airb

gitblog_01056的博客 1161

Airbnb JavaScript最佳实践:变量声明、提升机制与作用域管理

Airbnb JavaScript Style Guide 中文版是一套广泛采用的JavaScript编码规范,旨在帮助开发者编写更清晰、可维护的代码。本文将深入解析其中关于变量声明、提升机制与作用域管理的核心规则,帮助你避开常见陷阱,提升代码质量。 ## 为什么变量声明规范如此重要? 在JavaScript中,变量声明方式直接影响代码的可读性和运行时行为。Airbnb规范强调严格的变量声明规

gitblog_00495的博客 597

深度解析:JavaScript变量声明的演变与核心差异(var/let/隐式声明)

var:历史产物,存在设计缺陷let/const:现代工程化必备,提供可靠的作用域控制隐式声明:绝对避免的危险模式随着ES模块的普及和TypeScript的兴起,配合const优先原则,开发者可以构建出更健壮、可维护的应用程序。理解变量声明机制的底层原理,是掌握JavaScript执行上下文、闭包等高级概念的重要基础。

airCyan_的博客 765

JavaScript 变量声明关键字

3. const(常量,值不允许修改,推荐优先用)如果 const 存的是对象、数组,里面内容可以改。缺点:容易污染变量,出现意想不到的 bug。2. let(声明可变变量,推荐)需要后期改变值的时候,用 let。存在变量提升,可以先使用再声明。没有变量提升,必须先声明后使用。1. var(旧版,不推荐)块级作用域({ }里面生效)2.可以重复声明同一个变量。尽量不要再使用 var。

2603_96589662的博客 593

javascript 预编译梳理

(javascript 函数 预编译问题详解) js 三部曲 语法分析 -----> 预编译 ------> 解释执行 预编译前奏 function test(){ console.log('a'); } test(); //可以执行 test(); function test(){ console.log('a'); } // 这样也可以执行 就是因为预编译的存在 var a = 123; console.log('a'); 答案:123 con

m0_46232069的博客 167

前端简单的的变量声明

在 ES5 时代只有var来声明变量,存在很多设计缺陷。ES6 新增了let和const,引入块级作用域,解决了var带来的很多 bug。开发中现在基本推荐优先使用letconst,少用或者不用var。下面对比三者核心特点。

qq_63084249的博客 236

JS中var、let和const的区别详解

特性varletconst作用域函数作用域块级作用域块级作用域变量提升是(初始化为undefined)是(存在TDZ)是(存在TDZ)重复声明允许不允许不允许全局对象属性是否否重新赋值允许允许不允许必须初始化否否是默认使用const需要重新赋值时使用let避免使用var掌握这些区别对于编写健壮的JavaScript代码至关重要。

2601_96376625的博客 284
上一篇: webpack基本使用
下一篇: teamviewer 连不上的问题
史蒂芬李
博客等级 码龄14年 7粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值