18910140161

Javascript变量作用域

顺晟科技

2021-06-16 10:57:57

232

一、变量声明

变量用关键字var声明,例如:

var I;var numvar a,b;var name=' bingdianvar i=0,j=1,k=6;

var关键字声明的变量是性的,用delete运算符删除这些变量会导致错误。

x=1;删除x;console . log(x);//x未定义

javascript的变量类型是松散类型的,可以用来保存任何数据类型。您可以在修改变量值的同时修改变量类型:

var答案=10;x='答案是' 10y=10 '是答案' console . log(x);//答案是10 console . log(y);//10是answer var a=' 17 '-8;//9 var b=' 17 ' 8;//178 console . log(a);console . log(b);

用var关键字多次声明同一个变量是合法的。

使用未声明的变量将引发错误。

二、变量作用域

变量的作用域是程序中定义变量的区域。函数中声明的变量只在函数内部起作用(局部变量必须用var关键字声明)。

在函数内,局部变量的作用域优先级高于同名的全局变量,例如:

var i=99var foo=function(){ var I=10;console . log(I);} foo();//10使用本地变量console . log(I);//99使用全局变量

声明局部变量时,必须使用var关键字。当您使用var关键字声明变量时,变量将自动添加到最近的可用环境中。如果不写var,变量会暴露在全局上下文中,这可能与现有变量冲突。另外,如果不添加,很难知道变量的作用域是什么,变量很容易像局部作用域一样泄漏到Document或Window中,所以需要用var声明变量。示例:

var a=3;var foo=function(){ a=10;b=22console . log(a);console . log(b);} foo();//10 22 con sole . log(a);//10 console . log(b);//22

如果一个变量在没有声明的情况下被初始化,它将被自动添加到全局环境中。请看下面两个例子:

函数add(a,b){ var sum=a b;返回总和;}var rs=add(2,3);console . log(RS);//5 console . log(sum);//sum未定义函数add(a,b){ sum=a b;返回总和;}var rs=add(2,3);console . log(RS);//5 console . log(sum);//5 sum初始化赋值时没有使用var关键字。调用add()后,加到全局变量的sum继续存在。

javascript执行代码时,创建了一个上下文执行环境,全局环境是最外层的环境。每个函数在被调用时都创建自己的执行环境,当函数被执行时,当前的执行gg'f环境被破坏。每个执行环境都有一个与之关联的范围链。当执行代码时,javascript引擎通过搜索执行环境的范围链来解析标识符,如变量和函数名。解析过程从作用域链的前端开始,逐步向上查询与给定名称匹配的标识符。一旦找到标识符,搜索过程就停止。如果没有找到,它将继续沿着作用域链向上搜索,直到找到全局对象。如果未找到,则认为标识符未定义。标识符在作用域链中的位置越深,查找和访问它的时间就越长,所以要尽可能多地使用局部变量。

全局环境只能访问全局环境中定义的变量和函数,不能直接访问本地环境中的任何数据。

三、没有块级作用域

var a=8;var foo=function(){ console . log(a);//未定义var a=5;console . log(a);//5 } f();

因为局部变量是在整个函数foo()中定义的,全局变量隐藏在整个函数中。虽然局部变量是在整个函数体中定义的,但是在var语句之后并没有初始化。所以更好在函数顶部声明函数中用到的所有变量。

四、未定义的变量和未赋值的变量

未赋值的变量值是未定义的,使用未定义的变量会导致错误。

var a;console . log(a);//undefinedconsole . log(b);//b未定义

五、垃圾收集(grabage collection)

Javascript有一个自动垃圾收集机制,JavaScript解释器可以检测程序何时不再使用某个对象,并释放其占用的内存。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航