JavaScript之变量(声明、解析、做用域)

声明(建立) JavaScript 变量

在 JavaScript 中建立变量一般称为"声明"变量。javascript

1、咱们使用 var 关键词来声明变量:java

var carname;

变量声明以后,该变量是空的,其值其实是 undefined。函数

如需向变量赋值,请使用等号:this

carname="Volvo";

不过,您也能够在声明变量时对其赋值:spa

var carname="Volvo";
当使用var声明一个变量时,建立的这个属性是不可配置的,也就是说没法经过delete运算符删除
2、也可以使用let声明,let容许你声明一个做用域被限制在块级中的变量、语句或者表达式。在Function中局部变量推荐使用let变量,避免变量名冲突。let 声明的变量只在其声明的块或子块中可用,这一点,与var类似。两者之间最主要的区别在于var声明的变量的做用域是整个封闭函数。
function varTest() {     var x = 1;     if (true) {         var x = 2; // 一样的变量!         console.log(x); // 2     }     console.log(x); // 2 } function letTest() {     let x = 1;     if (true) {         let x = 2; // 不一样的变量          console.log(x); // 2      }     console.log(x); // 1 }

从新声明 JavaScript 变量

若是从新声明 JavaScript 变量,该变量的值不会丢失:code

在如下两条语句执行后,变量 carname 的值依然是 "Volvo":对象

var carname="Volvo";
var carname;

变量的解析

名字解析顺序blog

javascript中一个名字(name)以四种方式进入做用域(scope),其优先级顺序以下:
一、语言内置:全部的做用域中都有 this 和 arguments 关键字
二、形式参数:函数的参数在函数做用域中都是有效的
三、函数声明:形如function foo() {}
四、变量声明:形如var bar;ip

名字声明的优先级如上所示,也就是说若是一个变量的名字与函数的名字相同,那么函数的名字会覆盖变量的名字,不管其在代码中的顺序如何。但名字的初始化倒是按其在代码中书写的顺序进行的,不受以上优先级的影响作用域

变量的做用域

javascript是没有块级做用域的函数是JavaScript中惟一拥有自身做用域的结构。

var v = "hello" ;
if ( true ){
   console.log(v);
   var v = "world" ;
}
输出结果为:hello
修改以下:
var v = "hello" ;
( function (){
   console.log(v);
   var v = "world" ;
})();
输出结果为:undefined。由于在function做用域内,变量v的声明被提高了

Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,不少时候运行并无问题,可是这两种方式仍是有区别的。

例一:

<script type="text/javascript">
var scope="global";  
function t(){  
    var scope;
    console.log(scope);  
    scope="local";
    console.log(scope);  
}  
t();
console.log(scope);
</script>

输出结果为:

总结:var声明的变量在函数内部属于局部变量,不会改变全局变量的值。

若是改成:

<script type="text/javascript">
var scope="global";  
function t(){
    console.log(scope);  
    scope="local";
    console.log(scope);  
}  
t();
console.log(scope);
</script>

那么输出结果变为:

总结:没有用var声明的变量都是全局变量,并且是顶层对象的属性。(变量提高只是声明提高,赋值不会提高)

相关文章
相关标签/搜索