大家在学习JS时,对于变量提升和函数提升这个问题会不会有很多疑惑的地方?为什么要这么做?为什么不像其他动态语言一样,是从上到下逐句依次执行?
看过很多相关的文章,有人说这个的设计很低劣,它允许变量不声明就可以访问,这个问题让刚刚接触JS的人确实很不理解。
我们今天不说它是好还是坏,我们说下它究竟是怎么回事,应该怎么使用JS提升。
JavaScript提升是将所有声明提升到当前作用域顶部的默认行为,英文叫Hoisting。
在JavaScript中,可以在使用变量之后对其进行声明。
也就是说,可以在声明变量之前使用它。比如:
<p id="demo"></p>
<script>
x = 5;
document.getElementById("demo").innerHTML = x;
var x;
</script>
上面的代码是没错的。也可以不用声明x。最后var x;去掉,代码也不会出错的。
函数也会被提升。比如:
test(5);
function test(x) {
return x * x;
}
注意:下面的情况不会被提升。
1、用 let 或 const 声明的变量和常量不会被提升!
2、JavaScript 初始化不会被提升!
3、使用表达式定义的函数不会被提升。
在声明变量之前使用变量,虽然JS会提升声明,但是,这是一种不严格的写法。我不建议大家这样写,知道JS会提升就可以了。为了代码的可读性,为了程序不混乱,不容易出错,我强烈建议大家在每个作用域的开头声明所有变量。JS在解释代码的时候,就是从上到下,这样写,也比较符合我们的阅读习惯。
- 严格模式
JS里有一个指令:“use strict”;
它表示严格模式。通过在脚本或函数的开头添加 “use strict”; 来声明严格模式。一旦声明了严格模式,它所在的作用域内就必须按照严格模式来写JS。
“use strict” 指令只能在脚本或函数的开头被识别。
严格模式主要是规定了哪些写法不被允许。总结了一下:
第一:在不声明变量的情况下使用变量,是不允许的。比如:
"use strict";
x = 3.14; //报错
第二:重复参数名是不允许的。比如:
"use strict";
function test(a1,a1){} //报错
第三:八进制数值文本是不允许的。比如:
"use strict";
var x = 010; //报错
第四:转义字符是不允许的。比如:
"use strict";
var x = \010; //报错
第五:写入只读属性是不允许的。比如:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; //报错
第六:写入只能获取的属性是不允许的。比如:
"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; //报错
第七:删除变量/函数/不可删除的属性是不允许的。比如:
"use strict";
var x = 123;
delete x; //删除变量报错
"use strict";
function test(p1, p2) {};
delete test; //删除函数报错
"use strict";
delete Object.prototype;//删除不可删除的属性报错
第八:字符串 “eval” 、"arguments"不可用作变量。比如:
"use strict";
var eval = 123; //报错
var arguments = 456; //报错
第九:with 语句是不允许的。比如:
"use strict";
with (document){
write("您好 !");
write("这个文档的标题是 : "+ title);
}; // 报错
第十:处于安全考虑,不允许 eval() 在其被调用的作用域中创建变量。比如:
"use strict";
eval ("var x = 2");
alert (x); //报错
第十一:禁止this关键字指向全局对象,此时的this是undefined。比如:
function f(){
return !this;
}
// 返回false,因为"this"指向全局对象,"!this"就是false
function f(){
"use strict";
return !this;
}
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
严格模式中不允许使用为未来预留的关键词。它们是:
1、implements
2、interface
3、let
4、package
5、private
6、protected
7、public
8、static
9、yield
比如:
"use strict";
var public = 1500; //报错
今天要讲的就这么多,如果想看更多关于前端知识的文章,欢迎搜索微信公众号:“刘小妞的栖息地”或者识别下面的二维码查看更多文章。