标签:变量 JavaScript var 全局变量 声明 赋值
变量
变量声明
在JavaScript程序中,使用一个变量之前应当先声明,变量的作用是给某一个值或是对象标注名称。变量是使用关键字var来声明的,如下所示:
var huangzihan; // 声明变量huangzihan
var HUANGZIHAN; // 声明变量HUANGZIHAN
var Huangzihan; // 声明变量Huangzihan
var HuangZihan; // 声明变量HuangZihan
也可以通过一个var关键字来声明多个变量:
var huangzihan, HUANGZIHAN, Huangzihan, HuangZihan; // 声明多个变量
而且还可以将变量的初始赋值和变量声明合写在一起:
如果未在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值之前,它的初始值就是undefined。读取这类变量的值不会引起运行时错误。需要注意的是,在大部分情况下,读取undefined值都是产生错误的根源。
JavaScript中的变屋没有变量类型。因为没有变量类型,所以对于同一个变量,既可以赋值为字符串,也可以赋值为数字,就像下面这样。不过通常情况下,以这种方式来使用变量并不是好习惯.所以请尽可能避免出现这样的代码。
在表达式中写上某个变量名之后就能获取该变量的值。
如果要读取没有被声明的变量(即作为右值使用该变量:),就会引发ReferenceError异常;如果将其作为坐值使用,即作为赋值对象使用,则不会发生错误。
我们注意到,在for和for/in循环中同样可以使用var语句,这样可以更简洁地声明在循环体语法内中使用的循环变量。例如:
如果你之前编写过诸如C或Java的静态语言,你会注意到在JavaScript的变量声明中并没有指定变量的数据类型。JavaScript变量可以是任意数据类型。例如,在JavaScript中首先将数字赋值给一个变量,随后再将字符串赋值给这个变量,这是完全合法的:
注
编程语言分为动态(类型)语言和静态(类型)语言,动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。
Python、Ruby和JavaScript就是典型的动态类型语言。静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的铮态类型语言还有C#、JAVA等。
重复的声明和遗漏的声明
熟悉JavaScript的人也许知道,在JavaScript中var关键字是可以省略的。尽管此前提到,变量是通过var来声明的,但其实不通过var来声明也可以对变量进行赋值。这样的变量称为隐式声明变量。釆用隐式声明的变量都是全局变量,即使是在函数内部隐式声明的变量也属于全局变量。
在函数外部通过var声明的变量也是全局变量,这类全局变量:是显式声明的。为了和显式声明的全局变量相区别,那些没有通过var声明的变量被称为隐式全局变量。
应当尽可能避免使用全局变量,特別是应该避免使用隐式全局变量。开发者只需做恰当的处理,即在声明变量时总是使用var,就可以完全避免使用隐式全局变量,从而解决这一问题。
使用var语句重复声明变量是合法且无害的。如果重复声明带有初始化器,那么这就和一条简单的赋值语句没什么两样。
如果你试图读取一个没有声明的变量的值,JavaScript会报错。在ECMAScript 5严格模 式中,给一个没有声明的变量赋值也会报错。然而从历史上讲,在非严格模式下,如果给一个未声明的变量赋值,JavaScript实际上会给全局对象创建一个同名属性,并且它工作起来像(但并不完全一样)一个正确声明的全局变量。这意味着你可以侥幸不声明全局变量。但这是一个不好的习惯并会造成很多bug,因此,你应当始终使用var来声明变量。
变量作用域
一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。
在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。
尽管在全局作用域编写代码时可以不写var语句,但声明局部变量时则必须使用var语句。思考一下如果不这样做会怎样:
scope = "global"; // 声明一个全局变量,甚至不用var来声明
function checkscope2() {
scope = "local"; // 糟糕!我们刚修改了全局变量
myscope = "local"; // 这里显式地声明了一个新的全局变量
return [scope, myscope]; // 返回两个值
}
checkscope2() // => ["local", "local"]: 产生了副作用
scope // =〉"local": 全局变量修改了
myscope // => "local": 全局命名空间搞乱了
上例子中这两行代码不是很理解:
scope // =〉"local": 全局变量修改了
myscope // => "local": 全局命名空间搞乱了
上面这个例子的实践:
函数定义是可以嵌套的。由于每个函数都有它自己的作用域,因此会出现几个局部作用域嵌套的情况,例如:
标签:变量,JavaScript,var,全局变量,声明,赋值 来源: https://www.cnblogs.com/Huang-zihan/p/15647830.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。