浅谈JavaScript的语言特性

车辆厂PLM一期落地边界:NX与Teamcenter的EBOM到MBOM实施指南 PLM(产品生命周期管理)是制造企业实现设计、工艺与BOM数据协同的核心系统。其原理是通过统一数据模型与流程引擎,将CAD模型、物料清单和工艺路线关联,确保数据源唯一与版本可控。技术价值在于打通EBOM到MBOM的转换链路,消除信息孤岛,提升工程变更效率。典型应用场景包括车辆厂数字化设计、焊接工艺规划及ERP/MOM集成。本文以西门子NX与Teamcenter组合为例,深入解析车辆厂PLM一期方案的功能切分、数据流转与实施避坑要点,为离散制造企业提供可复用的落地检查清单。 阅读详情

前言

在JavaScript中,作用域、上下文、闭包、函数等算是精华中的精华了。对于初级JSer来说,是进阶必备。对于前端攻城师来说,只有静下心来,理解了这些精华,才能写出优雅的代码。

本文旨在总结容易忘记的重要知识,不会讲基本的概念。如果对基本知识不太熟悉,就去翻下《 JavaScript权威指南》吧~

参考文章如下(建议读者朋友用chrome看这些文章吧,不然的话会错过很多精彩哦~):

ECMA-262

Ben Alman

ECMA-262

语言特性函数表达式

先看代码段:

var f = function foo(){
    return typeof foo; // foo是在内部作用域内有效
};
// foo在外部用于是不可见的
typeof foo; // "undefined"
f(); // "function"


这里想说一点的就是,在函数表达式中的foo,只能在函数内部引用,外面是不能引用的。

json

很多JavaScript开发人员都错误地把JavaScript对象字面量(Object Literals)称为JSON对象(JSON Objects)。 JSON是设计成描述数据交换格式的,它也有自己的语法,这个语法是JavaScript的一个子集。

{ “prop”: “val” } 这样的声明有可能是JavaScript对象字面量,也有可能是JSON字符串,取决于什么上下文使用它。如果是用在string上下文(用单引号或双引 号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。

// 这是JSON字符串
var foo = '{ "prop": "val" }';
// 这是对象字面量
var bar = { "prop": "val" };

还有一点需要知道的是,JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。

原型

function Animal (){  
    // ...
}
function cat (){  
    // ...
}  
cat.prototype = new Animal();//这种方式会继承构造函数里面的。
cat.prototype = Animal.prototype;//这种方式不会继承构造函数里面的。
//还有一个重要的细节需要注意的就是一定要维护自己的原型链,新手总会忘记这个!
cat.prototype.constructor = cat;

如果我们彻底改变函数的prototype属性(通过分配一个新的对象),那原始构造函数的引用就是丢失,这是因为我们创建的对象不包括constructor属性:

function A() {}
A.prototype = {
  x: 10
};
var a = new A();
alert(a.x); // 10
alert(a.constructor === A); // false!

让我们一起看下MDN上关于constructor的解释吧:prototype:Returns a reference to the Object function that created the instance’s prototype.因此,对函数的原型引用需要手工恢复:

function A() {}
A.prototype = {
  constructor: A,
  x: 10
};
var a = new A();
alert(a.x); // 10
alert(a.constructor === A); // true

然而,提交prototype属性不会影响已经创建对象的原型(只有在构造函数的prototype属性改变的时候才会影响到),就是说新创建的对象才有有新的原型,而已创建对象还是引用到原来的旧原型(这个原型已经不能被再被修改了)。

function A() {}
A.prototype.x = 10;
var a = new A();
alert(a.x); // 10
A.prototype = {
  constructor: A,
  x: 20
  y: 30
};
// 对象a是通过隐式的[[Prototype]]引用从原油的prototype上获取的值
alert(a.x); // 10
alert(a.y) // undefined
var b = new A();
// 但新对象是从新原型上获取的值
alert(b.x); // 20
alert(b.y) // 30

因此,“动态修改原型将影响所有的对象都会拥有新的原型”是错误的,新原型仅仅在原型修改以后的新创建对象上生效。这里的主要规则是:对象的原型是对象的创建的时候创建的,并且在此之后不能修改为新的对象,如果依然引用到同一个对象,可以通过构造函数的显式prototype引用,对象创建以后,只能对原型的属性进行添加或修改。

变量对象在函数执行上下文中,VO(variable object)是不能直接访问的,此时由活动对象(activation object)扮演VO的角色。 活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象:

function foo(x, y, z) {
  // 声明的函数参数数量arguments (x, y, z)
  alert(foo.length); // 3
  // 真正传进来的参数个数(only x, y)
  alert(arguments.length); // 2
  // 参数的callee是函数自身
  alert(arguments.callee === foo); // true
}

当进入执行上下文(代码执行之前)时,VO里已经包含了下列属性:1. 函数的所有形参(如果我们是在函数执行上下文中);

  • 所有函数声明(FunctionDeclaration, FD);
  • 所有变量声明(var, VariableDeclaration);

另一个经典例子: 

alert(x); // function
var x = 10;
alert(x); // 10
x = 20;
function x() {};
alert(x); // 20

根据规范函数声明是在当进入上下文时填入的; 在进入上下文的时候还有一个变量声明“x”,那么正如我们在上面所说,变量声明在顺序上跟在函数声明和形式参数声明之后,而且在这个进入上下文阶段,变量声明不会干扰VO中已经存在的同名函数声明或形式参数声明。变量相对于简单属性来说,变量有一个特性(attribute):{DontDelete},这个特性的含义就是不能用delete操作符直接删除变量属性。

a = 10;
alert(window.a); // 10
alert(delete a); // true
alert(window.a); // undefined
var b = 20;
alert(window.b); // 20
alert(delete b); // false
alert(window.b); // still 20。b is variable,not property!
var a = 10; // 全局上下文中的变量
(function () {
  var b = 20; // function上下文中的局部变量
})();
alert(a); // 10
alert(b); // 全局变量 "b" 没有声明.

this在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用括号()的左边是引用类型的值,this将设为引用类型值 的base对象(base object),在其他情况下(与引用类型不同的任何其它属性),这个值为null。不过,实际不存在this的值为null的情况,因为当this的值 为null的时候,其值会被隐式转换为全局对象。

(function () {
  alert(this); // null => global
})();<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.200000762939453px; "> </span>

在这个例子中,我们有一个函数对象但不是引用类型的对象(它不是标示符,也不是属性访问器),相应地,this值最终设为全局对象。

var foo = {
    bar: function () {
      alert(this);
    }
};
foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo
(foo.bar = foo.bar)(); // global
(false || foo.bar)(); // global
(foo.bar, foo.bar)(); // global

问题在于后面的三个调用,在应用一定的运算操作之后,在调用括号的左边的值不在是引用类型。

  • 第一个例子很明显———明显的引用类型,结果是,this为base对象,即foo。
  • 在第二个例子中,组运算符并不适用,想想上面提到的,从引用类型中获得一个对象真正的值的方法,如GetValue。相应的,在组运算的返回中———我们得到仍是一个引用类型。这就是this值为什么再次设为base对象,即foo。
  • 第三个例子中,与组运算符不同,赋值运算符调用了GetValue方法。返回的结果是函数对象(但不是引用类型),这意味着this设为null,结果是global对象。
  • 第四个和第五个也是一样——逗号运算符和逻辑运算符(OR)调用了GetValue 方法,相应地,我们失去了引用而得到了函数。并再次设为global。

正如我们知道的,局部变量、内部函数、形式参数储存在给定函数的激活对象中。

function foo() {
   function bar() {
      alert(this); // global
   }
   bar(); // the same as AO.bar()
}

活动对象总是作为this返回,值为null——(即伪代码的AO.bar()相当于null.bar())。这里我们再次回到上面描述的例子,this设置为全局对象。

作用域链

通过函构造函数创建的函数的scope属性总是唯一的全局对象。

一个重要的例外,它涉及到通过函数构造函数创建的函数。

var x = 10;
function foo() {
   var y = 20;
   function barFD() { // 函数声明
      alert(x);
      alert(y);
   }
   var barFn = Function('alert(x); alert(y);');
   barFD(); // 10, 20
   barFn(); // 10, "y" is not defined
}
foo();

还有:

var x = 10, y = 10;
with ({x: 20}) {
  var x = 30, y = 30;
//这里的 x = 30 覆盖了x = 20;
  alert(x); // 30
  alert(y); // 30
}
alert(x); // 10
alert(y); // 30

在进入上下文时发生了什么?标识符“x”和“y”已被添加到变量对象中。此外,在代码运行阶段作如下修改:

  • x = 10, y = 10;
  • 对象{x:20}添加到作用域的前端;
  • 在with内部,遇到了var声明,当然什么也没创建,因为在进入上下文时,所有变量已被解析添加;
  • 在第二步中,仅修改变量“x”,实际上对象中的“x”现在被解析,并添加到作用域链的最前端,“x”为20,变为30;
  • 同样也有变量对象“y”的修改,被解析后其值也相应的由10变为30;
  • 此外,在with声明完成后,它的特定对象从作用域链中移除(已改变的变量“x”--30也从那个对象中移除),即作用域链的结构恢复到with得到加强以前的状态。
  • 在最后两个alert中,当前变量对象的“x”保持同一,“y”的值现在等于30,在with声明运行中已发生改变。

函数

关于圆括号的问题

让我们看下这个问题:‘ 为何在函数创建后的立即调用中必须用圆括号来包围它?’,答案就是:表达式句子的限制就是这样的。

按照标准,表达式语句不能以一个大括号 { 开始是因为他很难与代码块区分,同样,他也不能以函数关键字开始,因为很难与函数声明进行区分。即,所以,如果我们定义一个立即执行的函数,在其创建后立即按以下方式调用:

function () {
  ...
}();
// 即便有名称
function foo() {
  ...
}();

我们使用了函数声明,上述2个定义,解释器在解释的时候都会报错,但是可能有多种原因。如果在全局代码里定义(也就是程序级别),解释器会将它看做是函数声明,因为他是以function关键字开头,第一个例子,我们会得到SyntaxError错误,是因为函数声明没有名字(我们前面提到了函数声明必须有名字)。第二个例子,我们有一个名称为foo的一个函数声明正常创建,但是我们依然得到了一个语法错误——没有任何表达式的分组操作符错误。在函数声明后面他确实是一个分组操作符,而不是一个函数调用所使用的圆括号。所以如果我们声明如下代码:

// "foo" 是一个函数声明,在进入上下文的时候创建
alert(foo); // 函数
function foo(x) {
   alert(x);
}(1); // 这只是一个分组操作符,不是函数调用!
foo(10); // 这才是一个真正的函数调用,结果是10

创建表达式最简单的方式就是用分组操作符括号,里边放入的永远是表达式,所以解释器在解释的时候就不会出现歧义。在代码执行阶段这个的function就会被创建,并且立即执行,然后自动销毁(如果没有引用的话)

(function foo(x) {
    alert(x);
})(1); // 这才是调用,不是分组操作符

上述代码就是我们所说的在用括号括住一个表达式,然后通过(1)去调用。注意,下面一个立即执行的函数,周围的括号不是必须的,因为函数已经处在表达式的位置,解析器知道它处理的是在函数执行阶段应该被创建的FE,这样在函数创建后立即调用了函数。

var foo = {
    bar: function (x) {
        return x % 2 != 0 ? 'yes' : 'no';
    }(1)
};
alert(foo.bar); // 'yes'

就像我们看到的,foo.bar是一个字符串而不是一个函数,这里的函数仅仅用来根据条件参数初始化这个属性——它创建后并立即调用。

  1. 因此,”关于圆括号”问题完整的答案如下:
  2. 当函数不在表达式的位置的时候,分组操作符圆括号是必须的——也就是手工将函数转化成FE。
  3. 如果解析器知道它处理的是FE,就没必要用圆括号。

自由变量:

function testFn() {
   var localVar = 10;//对于innerFn函数来说,localVar就属于自由变量。
   function innerFn(innerParam) {
      alert(innerParam + localVar);
   }
   return innerFn;
}

闭包的静态作用域:

var z = 10;
function foo() {
  alert(z);
}
foo(); // 10 – 使用静态和动态作用域的时候
(function () {
  var z = 20;
  foo(); // 10 – 使用静态作用域, 20 – 使用动态作用域
})();
// 将foo作为参数的时候是一样的
(function (funArg) {
    var z = 30;
    funArg(); // 10 – 静态作用域, 30 – 动态作用域
})(foo);

理论:因为作用域链,使得所有的函数都是闭包(与函数类型无关: 匿名函数,FE,NFE,FD都是闭包)。从实践角度:以下函数才算是闭包:* 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)

* 在代码中引用了自由变量

最后:

ECMAScript是一种面向对象语言,支持基于原型的委托式继承。


 

原文:本文来自文章作者 @freestyle21 

javascript入门语言特点 非常好的东东,只有认识到了javascript的不同,才能更好的运用。看着老外们做的网页太强了,从入门开始,你也能成小强。我感觉这篇文章对我有很大启发。 立即下载

相关推荐

从ResNet到EfficientNet:特征金字塔网络(FPN)在不同骨干网中的适配指南

本文深入探讨了特征金字塔网络(FPN)与ResNet、VGG、EfficientNet等主流骨干网络的适配策略。文章详细解析了FPN的核心原理,并针对不同骨干网络的特征提取特性,提供了通道对齐、参数量估算及迁移学习的系统化指南,旨在帮助开发者在目标检测等视觉任务中构建高性能、高效率的模型。

weixin_29047919的博客 220

javascript语言有哪些特点,简述javascript的主要特点

3、事件驱动:JavaScript可以直接对用户或客户输入做出响应,无需经过web服务程序。他对用户的响应,是以事件驱动的方式进行的,所谓事件驱动,指的是在主页执行了某种操作所产生的动作,此动作称为“事件”。只要能运行浏览器的计算机,并支持JavaScript的浏览器就可以正确执行。2、基于对象:javah是一种基于对象的语言,能运用自己已经创建了的对象,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。1、解释性:java是一种解释语言,源代码不需要经过编译,直接在浏览器上运行时被解释。

wenangou的博客 318

手把手教你用ADS优化肖特基二极管检波电路(附RC参数避坑指南)

本文详细介绍了如何使用ADS软件优化肖特基二极管检波电路,包括RC参数设置、常见失真问题分析与解决方案。通过实战案例和参数优化技巧,帮助射频工程师避免设计陷阱,提升电路性能。特别附有RC参数避坑指南,适用于调幅解调、功率检测等应用场景。

m2n3o4p5的博客 198

javascript有哪些特点

因此,当用户输入数据时,数据可以由客户机应用程序直接处理,而不是由服务器处理。JavaScript是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。它的简单性主要体现在:第一,JavaScript是一个基于Java基本语句和控制流的简单而紧凑的设计,这是一个非常好的过渡,供用户学习Java或其他C语言编程语言。只要计算机能运行浏览器,支持javascript浏览器,就可以正确执行,实现“一次写,环游世界”的梦想。

zzyibeile的博客 855

Java开发者必看:5分钟搞定PaddleOCR表格识别,导出Excel和HTML超详细教程

本文为Java开发者提供了集成PaddleOCR实现智能表格识别的详细教程,包括环境配置、核心代码实现、结果导出到Excel和HTML的步骤,以及性能优化技巧。通过PaddleOCR技术,开发者可以快速将图片表格转换为结构化数据,大幅提升工作效率。

weixin_30872499的博客 98

java爬虫(爬取银行理财数据)

import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; imp

ROCK 2490

JavaScript JavaScript 特性

JavaScript 是一门灵活而强大的语言,其动态特性、事件驱动模型和单线程异步机制让它在前端开发中占据主导地位。通过掌握 JavaScript 的特性及其机制,开发者可以更高效地构建现代化的 Web 应用。理解动态与弱类型,谨慎处理隐式转换。掌握异步编程模式,包括Promise和。熟悉事件驱动和模块化,编写高效可维护的代码。

Flying_Fish_roe的博客 1264

高通IPA硬件加速介绍

‌ 高通IPA (Internet Protocol Accelerator)模块是一种硬件加速模块,由高通公司(Qualcomm)提供,主要用于优化移动设备上的网络数据传输,特别是通过 LTE 、 5G 等移动网络的数据传输‌‌。IPA模块通过硬件加速,显著提高了数据传输的速度和效率,同时降低了设备的功耗,并提供了更稳定的网络连接,减少了数据传输中的丢包和延迟‌。

四儿家的小祖宗的博客 1622

简述javascript语言的特点,javascript语言有哪些特点

静态语言运行时因为只需运行目标程序,所以运行速度快,但是因为要注意变量的类型,需要多注意一些东西,而动态语言比较自由,可以将思想更多的集中在我们所开发的东西上。同时也因为动态语言的灵活性太高,当代码数量太大时,很多东西将变得不可控,不如静态语言稳定,所以当开发大型项目时,要优先选用静态语言。不同的浏览器在浏览一个带有JavaScript脚本的主页时,由于对JavaScript的支持稍有不同,其。,只要计算机能运行支持js的浏览器,就可正确执行,从而实现了“编写一次,走遍天下”的梦想。

神经网络爱好者 227

2025华为od机试真题B卷【停车场费用统计】Python实现

2025华为od机试真题B卷【停车场费用统计】Python实现

MISAYAONE的博客 535

阿里云百炼全解析:一站式大模型开发平台的架构与行业实践

摘要: 阿里云百炼平台通过一站式架构革新大模型开发范式,将传统碎片化工具链整合为统一工作流,实现开发周期从月级到小时级的跃迁。其核心架构包含接入层、引擎层与资源层,关键技术突破包括MCP服务协议、多模态引擎及高性能训练优化。平台提供全生命周期开发支持,从数据准备到模型部署,并通过VPC隔离、数据加密构建企业级安全体系。已在医疗、电力等行业实现显著增效,如阿斯利康药物分析系统准确率提升至95%。未来将向多Agent协同、边缘计算等方向演进,推动AI技术深度融入产业核心。

fudaihb的博客 1988

浅谈js

二  解释型动态类型弱类型多范式语言 2.1 语言按各种方法可以分为各种类型,按编译执行过程,可以分为编译型语言和解释型语言。 比如 c 语言,必须先经过编译生成目标文件,然后链接各个目标文件和库文件,生成可执行文件。 Java、scala 则是先编译成字节码,然后解释执行字节码(可以理解为编译型语言也可以理解为解释型语言)。 准确的理解,java 是编译型语言,源代码整个编译成字节码,j

lanyangyang0703的博客 383

汽车标定技术(七)--英飞凌TC3xx_Overlay实现页切换

今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。

认真搞搞汽车MCU 4015

嵌入式偶发故障排查实战:串口假故障、蓝牙断开与烧录失败三套方法论

串口通信、蓝牙连接与固件烧录是嵌入式硬件联调中的基础环节,其偶发故障往往源于物理层、驱动层或供电层的边界条件,而非应用层代码逻辑。理解时序、信号完整性与批次差异对通信稳定性的影响,是提升工程可靠性的关键。在产线抽检、客户演示等场景中,快速定位串口假故障、蓝牙断开与烧录失败根因,能显著降低调试成本。本文围绕换机排除法、录屏取证与新旧批次对照三种手段,系统梳理偶发问题的排查路径与工具链。

weixin_34409357的博客 278

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

第五周作业

  浅谈JavaScript   由于本次团队项目要用到JavaScript,而我却对这门语言不是很熟悉,所以这周通过上网和看书来大致得了解了一下JavaScript这门语言。   JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。   JavaScript有一些非常优秀的想法,也有...

weixin_30645617的博客 70

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

浅谈JavaScript

最近工作中接触到JavaScript相关项目,作为一名JS初学者,通过项目与学习获得了JS的一些知识,借着这篇文章,分享一下这段时间了解到的内容。 在开始之前,让我们先思考以下几个问题: JavaScript以Java为前缀,两种编程语言之间有什么关联? JS能够帮助前端开发者解决什么问题? 市场上有各种各样的浏览器,怎么能够保证同一段JS代码在不同浏览器都可以执行成功呢? JS能够操作网页内容,开发者是否可以通过恶意JS代码入侵用户电脑? 在Java中,需要定义数据类型,而在JS中却不用显式申明变量数据

weixin_47559434的博客 541

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JavaScript介绍:简介、特性及类型浅谈

我们知道生活中客观存在的一切事物皆为对象,那在程序中的对象是什么样子呢?我们可以将程序中的对象理解为客户端世界中的对象在一种计算机中的一种表示方式.所有的编程语言中提到的对象其性质都是类似的,它往往对应内存中的一块区域,在这个区域中存储对象的属性或方法信息。

hdxx2022的博客 136

浅谈JavaScript的语言结构及框架

转自:微点阅读(www.weidianyuedu.com)微点阅读 - 范文大全 - 免费学习知识的网站 JavaScript JS是遵循ECMAScript规范的解释型脚本语言。它是多范式、支持面向对象、动态、指令等特性的语言。 而如今,JS已经可以在许多非浏览器环境中使用。 Javascript是一种简单易用的语言,主要用于设计或开发Web应用,用来控制网页行为。Javascript基本语法与Java和c ++语言相类似,如果你有这些语言基础,可以更快的上手,包括理解该语言所需的

asd3331380的博客 188

关于JavaScript的语言结构及框架浅谈

转自:微点阅读https://www.weidianyuedu.com JavaScript JS是遵循ECMAScript规范的解释型脚本语言。它是多范式、支持面向对象、动态、指令等特性的语言。 而如今,JS已经可以在许多非浏览器环境中使用。 Javascript是一种简单易用的语言,主要用于设计或开发Web应用,用来控制网页行为。Javascript基本语法与Java和c ++语言相类似,如果你有这些语言基础,可以更快的上手,包括理解该语言所需的概念。 JS语言结构如下..

ysds20211402的博客 184

JavaScript代码保护浅谈

一、国外: 1.jscrambler(商业):链接:https://jscrambler.com/ 收费比较高; 2.JavaScript-Obfuscator(开源) 有了开源很多人都在这个基础上改改,但是强度也是会比较弱; 二、国内: 1.jshaman: https://www.jshaman.com/guide.html 看了他们这个说明可能以上两个...

雪一梦的博客 5653
上一篇: 怎么成为技术大牛
下一篇: 10 位顶级 PHP 大师的开发原则
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值