如何更好的理解javascript变量类型以及变量作用域

如题所述


变量的类型
Javascript和Java、C这些语言不同,它是一种无类型、弱检测的语言。它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量。例如:
i=100;//Number类型
i="variable";//String类型
i={x:4};//Object类型
i=[1,2,3];//Array类型JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的代码时相当痛苦。

全局变量和局部变量
当JS解析器执行时,首先就会在执行环境里构建一个全局对象,我们定义的全局属性就是做为该对象的属性读取,在顶层代码中我们使用this关键字和window对象都可以访问到它。而函数体中的局部变量只在函数执行时生成的调用对象中存在,函数执行完毕时局部变量即刻销毁。因此在程序设计中我们需要考虑如何合理声明变量,这样既减小了不必要的内存开销,同时能很大程度地避免变量重复定义而覆盖先前定义的变量所造成的Debug麻烦。
变量作用域
任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,运行下面代码:
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义一个输出函数
function outPut(s){
document.writeln(s)
}
//全局变量
var i=0;
//定义外部函数
function outer(){
//访问全局变量
outPut(i); // 0
//定义一个类部函数
function inner(){
//定义局部变量
var i = 1;
// i=1; 如果用隐式申明那么就覆盖了全局变量i
outPut(i); //1
}
inner();
outPut(i); //0
}
outer();
</SCRIPT>输出结果为0 1 0,从上面就可以证明JS如果用var在函数体中声明变量,那么此变量在且只在该函数体内有效,函数运行结束时,本地变量即可销毁了。
由于上面的这个JS特性,还有一个关键的问题需要注意。此前一直使用ActionScript,虽然它和JS都是基于ECMA标准的,但在这里还是略有不同的。例如下面代码:
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义一个输出函数
function outPut(s){
document.writeln(s)
}
//全局变量
var i=0;
//定义外部函数
function outer(){
//访问全局变量
outPut(i); // 0
//定义一个类部函数
function inner(){
outPut(i); //undefiend
var i=1;
outPut(i); //1
}
inner();
outPut(i); //0
}
outer();
</SCRIPT>JS变量作用域
<script language ="javascript" type ="text/javascript" >
var a = "change";
function fun() {
alert(a);//输出undefined
var a = "改变了";
alert(a);//输出改变了
}
alert(a);//输出change
fun();
</script>var定义的是一个作用域上的变量,在第一次输出a之前,JS在预编译分析中已经将a赋值为change,所以第一次输出change,当调用到fun()函数的时候,JS创建一个新的作用域,在输出a之前,初始化所有var变量的值为undefined,所以fun()中第一次输出的是undefined,第二次输出已经给a赋值了,所以输出新的值;两个a在函数里面和外面是不同的两个变量,如:
<script language ="javascript" type ="text/javascript" >
var b;
function fun() {
b = "change";
}
alert(b);//输出undefined
</script>变量b在函数外面已经定义了,在函数中有给b赋值,但输出的却是undefined。
温馨提示:内容为网友见解,仅供参考
无其他回答

如何更好的理解javascript变量类型以及变量作用域
变量作用域 任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,运行下面代码: <SCRIPT LANGUAGE="JavaScript" type="text\/javascript"> \/\/定义一个输出函数 function outP...

深入理解JS:var、let、const的异同
1. 作用域不同:var 的变量作用域是全局或函数块,而 let 和 const 的作用域更精细,仅限于它们所在的代码块,包括嵌套的 if、for等结构。2. 声明重复性:var 允许在同一作用域内重复声明,let 则不允许,否则会报错。let 的检查在词法分析阶段完成。3. 变量绑定:var 在全局环境中会直接绑定到...

浅析Js中const,let,var的区别及作用域
在 ES6 之前,JavaScript 只有两种作用域:全局变量 与 函数内的局部变量。var定义变量 1.1 语法及说明 var关键字用于声明一个或多个变量,声明多个变量时使用逗号(,)分隔,声明变量的同时可以对其初始化。语法法结构如下:使用var声明变量时,声明的变量作用域是在当前位置的上下文件中:函数的内部(声...

理解什么是JS作用域,闭包和基本的JS作用域面试题
作用域:它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的。表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。闭包:在js中的我的理解就是函数嵌...

浅谈js中什么是封闭函数、闭包、内置对象
一、变量作用域变量作用域指的是变量的作用范围,javascript中的变量分为全局变量和局部变量1、全局变量:在函数之外定义的变量,为整个页面公用,函数的内部外部都可以访问。2、局部变量:在函数内部定义的变量,只能在定义该变量的函数内部访问,外部无法访问。函数内部访问变量时,先在内部查找是否有此变量...

Js基础27:作用域
JS是解释性语言,JS引擎对代码的处理分为两步:4、作用域链和访问规则 在JavaScript里面,函数内部是可以包含另一个函数的 此时函数b就被函数a包含越来了,这样就形成了两层作用域。如果有以下代码:三个同名变量放在三个作用域内 会依次输出:10,20,30 虽然多个变量x同名,但是不同作用域内优先使用...

全面掌握Javascript中「let、var、const」的区别
JavaScript中的变量声明方式有var、let和const,它们之间存在显著差异。主要的区别体现在块级作用域、变量提升、暂时性死区以及变量的可变性上。首先,var在ES5中是唯一的变量声明方式,没有块级作用域。这导致内层变量可能覆盖外层,且循环变量易成为全局变量,增加了开发复杂性。ES6引入的let和const引入了块...

学废了,JavaScript 中的作用域与作用域链
写代码时无需过多关注作用域类型,只需遵循“从内向外”的查找原则。比如,就像家庭中找东西,先在自己家里找,再扩展到亲戚朋友,最后求助社区,这就是作用域链的直观比喻。最后,推荐使用let而非var,以避免不必要的变量污染。同时,我们提供线上直播培训课程,帮助大家深入理解作用域与作用域链。

javascript的两种变量作用域有什么不同
我在用局部变量的时候一般都是在函数里定义的,其他可能还会有其他的使用方法我也没多研究。全局变量就是可以在整个文件和包含了此文件(一般都是指JS文件)的文件中使用的变量叫全局变量,全局变量是在所有作用域(指函数、类等)外面定义的,因而所有作用域都可以使用该变量 ...

JavaScript 中变量声明 var、let、const 的区别
变量声明在JavaScript中是基础语法,有var、let、const三种方式。var声明变量总是全局或局部作用域,且在编译时提升,可以在未定义前调用。let声明变量为块级作用域,提升发生在声明阶段,可以避免全局变量冲突。const声明变量值不可变,但对象和数组内容可以修改,避免了代码修改引起的问题。总结,var适用于...

相似回答
大家正在搜