JavaScript基础:深入理解变量与标识符机制

作者:半夏

时间:2026-10-30

浏览:223

本文系统解析JavaScript中的变量与标识符概念。涵盖标识符命名规范、保留字限制,详解var声明、赋值与初始化流程。重点剖析全局与函数作用域差异、变量提升(hoisting)原理,以及ECMAScript严格模式下的行为区别,帮助开发者掌握变量管理的核心机制。

文章目录

变量与标识符概述

在JavaScript中,变量是一个核心概念,其工作机制构成了该语言的基础特性。从本质上讲,变量属于标识符(Identifier)的一种具体应用形式。下文将深入探讨这两者的定义、规则及内在联系。

定义

标识符本质上是一个名称,主要用于为变量、函数、属性或参数命名,也可作为循环语句中跳转位置的标记。


//变量
var Identifier = 123;
//属性
(new Object).Identifier = 'test';
//函数及参数
function IdentifierName(Identifier1){};
//跳转标记
Identifier:
for(var i = 0; i < 5; i++){
  if(i == 3){
    break Identifier;
  }
}

类比现实生活,某些事物保持恒定(如姓名、生日),而另一些则随时间变化(如心情、年龄)。在编程语境中,那些存储会发生变化数据的实体被称为变量。

当程序需要暂存数据以供后续使用时,会将该值赋予变量。变量(variable)充当了保存值的占位符角色,通过变量名即可引用其所包含的值。

 变量与标识符概述

标识符命名规则

命名规则

JavaScript区分大小写,且与其他编程语言类似,保留了一些特定标识符供语言内部使用,这些保留字不可用作普通标识符。

需注意,保留字范畴涵盖关键字、未来保留字、空字面量以及布尔值字面量。


保留字 ReservedWord ::
  Keyword
  FutureReservedWord
  NullLiteral
  BooleanLiteral

JavaScript标识符允许包含字母、数字、美元符号($)及下划线(_),但首字符严禁为数字。


//错误示范
 6num //开头不能用数字
 %sum //开头不能用除(_ $)外特殊符号,如(% + /等)
 sum+num //开头中间不能使用除(_ $)外特殊符号,如(% + /等)

JavaScript支持Unicode字符集中的字母和数字(含中文)作为标识符的一部分。这意味着开发者可以使用非英语字符或数学符号来构建标识符。


var 测试文字 = 'test';

出于代码可移植性及书写便捷性的考虑,通常建议避免使用扩展ASCII或Unicode字符。

在标识符命名风格上,驼峰命名法(CamelCase)为首选:首字母小写,后续每个单词的首字母大写。


var myMoodToday = 'happy';

针对不同的数据类型,JavaScript社区形成了约定俗成的标识符前缀命名规范。


类型          前缀      示例    
数组(Array)         a         aItems
布尔值(Boolean)      b         bIsComplete
浮点数(Float)       f        fPrice
函数(Function)       fn        fnHandler
整数(Integer)        i        iItemCount
对象(Object)        o        oDIv1
正则表达式(RegExp)    re        reEmailCheck
字符串(String)       s        sUserName
变量()Variant        v        vAnything

变量声明与赋值

变量声明

声明

在JavaScript中使用变量前必须先进行声明(declare)。声明变量需使用关键字var(variable的缩写)。


var i;
var sum;

单个var关键字可用于同时声明多个变量。


var i ,sum;

赋值

将值存入变量的操作称为赋值(assignment)。一旦变量被赋值,即认为该变量包含了此值。

首次给变量赋予值的过程被称为初始化。

变量的初始赋值操作可以与声明语句合并书写。


var message = 'hello';
var i=0,j=0,k=0;

若在var声明语句中未指定初始值,变量虽已声明,但在存入具体值之前,其默认值为undefined。

变量与标识符概述

在for循环和for-in循环中,同样可以使用var语句来声明循环变量,从而使代码更为简洁。


for(var i=0; i<10; i++)console.log(i);

变量可在声明时赋值,但声明语句中不得包含其他操作(如+=、-=等)。


var a = 2;//是正确的
var a += 2;//是错误的
var a = 2++;//是错误的,++只能用于变量,不能用于常量

重复声明

使用var语句对同一变量进行重复声明是合法且无害的。若重复声明时附带赋值操作,则等同于重新赋值。

变量与标识符概述

遗漏声明

若尝试读取一个未声明变量的值,JavaScript引擎会抛出错误。

变量与标识符概述

JavaScript允许遗漏声明,即直接对变量赋值而无需预先声明,此时赋值操作会自动创建该变量。

变量与标识符概述

然而,在ECMAScript 5的严格模式('use strict')下,对未声明变量赋值将导致报错。


<script>
'use strict';
a = 5;
console.log(a);
</script>
变量与标识符概述

变量特性与作用域

变量特性

JavaScript变量属于弱类型(或称松散类型),意味着它可以保存任何类型的数据。

编程语言通常分为动态类型语言和静态类型语言。动态类型语言在运行期间进行数据类型检查,编程时无需显式指定变量数据类型,语言会在首次赋值时内部记录类型。JavaScript是动态类型语言的典型代表。

在JavaScript中,修改变量值的同时也可以改变其数据类型。


var message = 'hi';
message = 100;//有效,但不推荐

变量松散类型的特性可总结为两点:一是声明时无需指定数据类型;二是赋值时可动态修改数据类型。

变量作用域

变量的作用域(scope),亦称执行环境(execution context),是指源代码中定义该变量的区域。

作用域主要分为全局作用域和函数作用域(局部作用域)两类。

全局作用域是最外层的执行环境。在Web浏览器中,全局执行环境对应window对象。所有全局变量和函数均作为window对象的属性和方法创建。全局变量具有全局作用域,在JavaScript代码的任何位置均可访问,直至应用程序退出(如关闭网页或浏览器)才被销毁。

在函数内部声明的变量仅在函数体内有效,称为局部变量,其作用域具有局部性。函数参数也是局部变量,仅在函数体内定义。当函数作用域内的代码执行完毕后,该作用域即被销毁,其中保存的所有变量和函数定义也随之消失。


function test(){
  var message = 'hi';
}
test();
alert(message);//错误

若省略var操作符,将创建一个全局变量。


function test(){
  message = 'hi';
}
test();
alert(message);//'hi'

虽然省略var可定义全局变量,但这并不推荐。在局部作用域中定义的全局变量难以维护,且有意忽略var会导致变量不会立即定义,从而引发混乱。在严格模式下,对未声明变量赋值会抛出ReferenceError错误。

在函数体内,局部变量的优先级高于同名全局变量。若在函数内声明的局部变量或函数参数与全局变量重名,全局变量将被局部变量遮蔽(遮盖)。


var scope = 'global';
function checkscope(){
  var scope = 'local';
  return scope;
};
checkscope();//'local'

声明提升(hoisting)

声明提升与块级作用域

块级作用域

块级作用域指花括号内每段代码拥有独立作用域,但JavaScript不具备块级作用域。JavaScript仅具备函数作用域:变量在声明它们的函数体及其嵌套的任意函数体内均有定义。

这意味着变量在声明前即可使用。JavaScript的这一特性被非正式地称为声明提升(hoisting),即函数内声明的所有变量(不涉及赋值)都被提前至函数体顶部。

需注意,除了变量提升外,函数定义也会被提升,相关内容将在函数章节详细阐述。


var scope = 'global';
function f(){
  console.log(scope);//undefined
  var scope = 'local';
  console.log(scope);//'local'
}

//变量声明提升之后,相当于下面代码
var scope = 'global';
function f(){
  var scope;
  console.log(scope);//undefined
  scope = 'local';
  console.log(scope);//'local'
}

由于JavaScript中没有块级作用域,部分程序员习惯将变量声明置于函数体顶部,这种写法能清晰反映真实的变量作用域。

变量与全局对象的关系

属性变量

当声明一个JavaScript全局变量时,实际上是在定义全局对象window的一个属性。

使用var声明的变量是不可配置的(non-configurable),即无法通过delete运算符删除。


var truevar = 1;
console.log(truevar,window.truevar);//1 1
delete truevar;//false
console.log(truevar,window.truevar);//1 1

若未使用严格模式并对未声明变量赋值,JavaScript会自动创建一个全局变量。以此方式创建的变量是全局对象的正常可配置属性,可以被删除。


window.fakevar1 = 10;
console.log(fakevar1,window.fakevar1);//10 10 
this.fakevar2 = 20;
console.log(fakevar2,window.fakevar2); //20 20
fakevar = 30;
console.log(fakevar,window.fakevar); //30 30

delete window.fakevar1;//true
delete this.fakevar2;//true
delete fakevar;//true

console.log(fakevar1,window.fakevar1);//报错
console.log(fakevar2,window.fakevar2); //报错
console.log(fakevar,window.fakevar); //报错

JavaScript全局变量作为全局对象的属性,这是ECMAScript标准强制规定的。局部变量则被视为与函数调用相关的某个对象的属性。ECMAScript 3称之为调用对象(call object),ECMAScript 5称之为声明上下文对象(declarative environment record)。JavaScript允许使用this关键字引用全局对象,但无法直接引用存放局部变量的对象。这种存放局部变量对象的特性属于内部实现细节,对外不可见。

以上即为关于JavaScript基础语法中变量与标识符的全面解析,希望能为读者提供参考。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章