js中变量注意事项
ECMAScript中的变量是弱类型的(同一个变量可以保存任何数据类型)。
- 通过var关键字来定义变量;
- 未经过初始化的变量的默认值是undefined;
- 使用var声明的变量是当前作用域的局部变量(如果在函数中定义一个变量,在函数执行完成后该变量就会被销毁);
- 没通过var关键字声明的变量会被自动声明为全局变量。
1 // 3 2 var iNum; 3 console.log(iNum); // undefined 4 5 // 4 6 function fnTest(){ 7 var sMsg = ‘hum‘; 8 console.log(sMsg); // hum 9 } 10 fnTest(); 11 console.log(sMsg); // sMsg is not defined 12 13 // 5 14 function fnTest1(){ 15 sMsg1 = ‘hum‘; // 未通过var关键字声明的变量 16 console.log(sMsg1); // hum 17 } 18 fnTest1(); 19 console.log(sMsg1); // hum 在函数外部能访问
NOTE:为声明的变量只能进行typeof和delete操作,其他任何操作都会抛出错误。
1 console.log(typeof iName); // undefined 2 console.log(delete iName); // true(居然返回true) 3 console.log(iName); // iName is not defined
严格模式注意事项:
- 给未经声明的变量赋值会抛出ReferenceError错误;
- 声明名为eval和arguments的变量会导致语法错误;
- 给未声明的变量进行delete操作会导致语法错误。
- undefined(变量未定义或定义了未赋值);
- boolean(布尔值);
- string(字符串);
- number(数值);
- object(对象或null);
- function(函数);
1 var iNum1 = 1; 2 3 function fnOuter(){ 4 var iNum2 = 11; 5 6 function fnInner(){ 7 var iNum3 = 111; 8 9 console.log(iNum1); // 作用域链查找:fnInner(无)->fnOuter(无)->window(1) 10 console.log(iNum2); // 作用域链查找:fnInner(无)->fnOuter(11) 11 console.log(iNum3); // 作用域链查找:fnInner(111) 12 } 13 fnInner(); 14 15 console.log(iNum1); // 作用域链查找:fnOuter(无)->window(1) 16 console.log(iNum2); // 作用域链查找:fnOuter(11) 17 console.log(iNum3); // 作用域链查找:fnOuter(无)->window(无)报错 18 } 19 fnOuter(); 20 console.log(iNum1); // 作用域链查找:window(1) 21 console.log(iNum2); // 作用域链查找:window(无)报错 22 console.log(iNum3); // 作用域链查找:window(无)报错
1 var iNum = 1; 2 function fnTest(){ 3 console.log(iNum); // undefined 4 var iNum = 11; 5 } 6 fnTest();
上面的代码输出了undefined。原因是当执行函数fnTest时会检索函数中所有变量的声明并优先执行。上面的代码就类似于下面的代码。
var iNum = 1; function fnTest(){ var iNum; // **变量声明提升 console.log(iNum); // undefined iNum = 11; } fnTest();
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。