JavaScript变量定义之——strict模式

Author Avatar
Emily Chan 4月 27, 2017
  • 在其它设备中阅读本文章

两种变量声明的区别

JavaScript中加var和不加var声明变量的区别:

归结为下面一句话,
var定义的变量为局部变量(在function中),不加var定义的变量为全局变量(无论是否在function中)。

具体分析如下:
var声明的是局部变量,它的作用范围仅在包含它的函数中,不同函数中的相同变量名不会互相冲突。
然而,不加var声明的是全局变量,它的缺陷在于:
在同一个页面中的不同JavaScript文件中,如果不加var定义了相同变量名的变量,那么两个变量会互相影响,导致难以调试的bug的产生。

Strict模式

由于这一缺陷,ECMAScript在之后的规范中推出了Strict模式,作用是在该模式下禁止使用不加var的方法定义变量,强制所有变量都必须用var(或const,let)进行声明,防止变量间的冲突。

Strict模式使用方法:

'use strict' //在js首行添加一行字符串如上

如何检验浏览器是否支持strict模式:

'use strict'
a = 'haha';
alert(a)
// 若浏览器不支持该模式则不报错
// 若浏览器支持则报ReferenceError错误 

参考:
廖雪峰JavaScript教程

既然讲到了var,那么我们来讲一下JavaScript中的三种声明方式的区别:
const,let,var
const——(ES6新提出)声明常量,声明时必须进行初始化,并且之后不能修改

'use strict'
const a = 7;
//const a;未初始化,报SyntaxError错误
console.log('a='+a);

let——声明块级作用域
函数内部中,var定义的是作用域为整个函数内部的变量,如果存在for循环,var无法定义作用域仅为for循环中的变量,而let则定义了for循环块级作用域的变量。
此外 ,即使let定义了相同变量名的变量,并且两者的作用域是包含和被包含的关系,外部作用域和内部作用域依旧互相隔离,互不影响。

function foo(){
    let i = 0;
    for (let i=2;i<3;i++){
        //
        alert("i in for:"+i);
    }
    alert("i out for:"+i);
}
foo();
//alert "i in for:2"
//alert "i in for:0"
//两个i不相互影响,for中的i只存在在循环块级作用域中。

var——声明局部作用域,声明的变量可以多次修改,不初始化的变量返回undefined,不报错。

var i = 0;
function foo(){
    i =1;
    alert(i);
}
foo();// 1
alert(i);// 1

var i = 0;
function foo(){
    var i =1;
    alert(i);
}
foo();// 1 ,i被重新声明并且作用域只存在在foo函数中。
alert(i);// 0

参考: