首页 > js在严格模式下遇到的疑问

js在严格模式下遇到的疑问

直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>
        !function(){
            x = 1;
            console.log( window.x );
        }();

        !function(){
            'use strict';
            x = 1;
            console.log( window.x );
        }();

    </script>

</body>
</html>

在看js的严格模式的时候 自己动手做观察 发现一个问题 当我两个函数一起执行的时候,分别打印出1 当我注释掉第一个函数 只执行第二个的时候 就报错 这是什么原因 求指导

还有一个问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>
        !function(a){
            'use strict';
            arguments[0] = 100;
            console.log( a );
        }(1);

        !function(a){
            'use strict';
            arguments[0].x = 100;
            console.log( a );
        }({ x: 1 });

    </script>

</body>
</html>

这里第一个打印出来的是1 怎么第二个打印出来的是100 严格模式对参数是对象不起作用吗


1.严格模式下,禁止使用未声明对象。

2.严格模式下,args和形参值相等,但是两者不存在时刻相等关系(仅在初次赋值时两者相等,后面修改一个不会改变另一个)

3.变量的值为对象类型时,存储的是对象的地址,对象里面随便折腾,只要对象地址不变,由2可知两者存储的地址还是相同的,所以还是相等的


!function(){
    x = 1; // 创建了一个全局变量 x
    console.log( window.x ); // 1
}();

!function(){
    'use strict';
    x = 1;
    console.log( window.x );
}();

在第一个函数里面,x = 1; 进行了 LHS 查找,在当前的函数作用域中查找变量 x,在当前作用域查找不到时向上层作用域继续查找,直到找到或者到达顶层的全局作用域。
LHS 查找在非严格模式下,查找到全局作用域还无法找到目标变量时,会创建一个具有该名称的全局变量,并返回给引擎。也就是说,在给未声明的变量赋值时,全局作用域就会自动创建一个全局变量(即没有使用 var 声明并赋值)。

也就是说,在第一个函数中 x = 1; 创建了一个全局变量 x, 值为 1。第二个函数因为使用 'use strict';, 所以 LHS 查找不到目标变量时不会自动或者隐式的创建全局变量。

当第一个函数存在时,隐式的创建了全局变量 x。当第二个函数调用时即能在全局作用域下查找到 x 这个变量,所以不会报错。并输出 1,1。而当第一个函数注释掉之后,第二个函数在严格模式下执行,LHS 查找不到目标变量,并且也不会隐式的创建全局变量 x。所以只执行第二个函数的时候就会抛出 ReferenceError 异常。


JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:

在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。

使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内,同名变量在不同的函数体内互不冲突。

为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。

第一个函数不使用严格模式时,实际先定义了一个全局变量i

【热门文章】
【热门文章】