JavaScript提升有什么用,为什么需要提升?需要这样写吗?

43 篇文章 0 订阅
33 篇文章 0 订阅

大家在学习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;  //报错

今天要讲的就这么多,如果想看更多关于前端知识的文章,欢迎搜索微信公众号:“刘小妞的栖息地”或者识别下面的二维码查看更多文章。

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值