javascript - js在严格模式下遇到的疑问
阿神
阿神 2017-04-11 12:32:18
[JavaScript讨论组]

直接上代码




    
    Document


    
    


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

还有一个问题




    
    Document


    
    


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

阿神
阿神

闭关修行中......

全部回复(3)
怪我咯

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

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

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

天蓬老师

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

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

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

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

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

巴扎黑
!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 异常。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号