直接上代码
Document
在看js的严格模式的时候 自己动手做观察 发现一个问题 当我两个函数一起执行的时候,分别打印出1 当我注释掉第一个函数 只执行第二个的时候 就报错 这是什么原因 求指导
还有一个问题
Document
这里第一个打印出来的是1 怎么第二个打印出来的是100 严格模式对参数是对象不起作用吗
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1.严格模式下,禁止使用未声明对象。
2.严格模式下,args和形参值相等,但是两者不存在时刻相等关系(仅在初次赋值时两者相等,后面修改一个不会改变另一个)
3.变量的值为对象类型时,存储的是对象的地址,对象里面随便折腾,只要对象地址不变,由2可知两者存储的地址还是相同的,所以还是相等的
JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。
使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内,同名变量在不同的函数体内互不冲突。
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
第一个函数不使用严格模式时,实际先定义了一个全局变量i
在第一个函数里面,
x = 1;进行了 LHS 查找,在当前的函数作用域中查找变量 x,在当前作用域查找不到时向上层作用域继续查找,直到找到或者到达顶层的全局作用域。LHS 查找在非严格模式下,查找到全局作用域还无法找到目标变量时,会创建一个具有该名称的全局变量,并返回给引擎。也就是说,在给未声明的变量赋值时,全局作用域就会自动创建一个全局变量(即没有使用
var声明并赋值)。也就是说,在第一个函数中
x = 1;创建了一个全局变量 x, 值为 1。第二个函数因为使用'use strict';, 所以 LHS 查找不到目标变量时不会自动或者隐式的创建全局变量。当第一个函数存在时,隐式的创建了全局变量 x。当第二个函数调用时即能在全局作用域下查找到 x 这个变量,所以不会报错。并输出 1,1。而当第一个函数注释掉之后,第二个函数在严格模式下执行,LHS 查找不到目标变量,并且也不会隐式的创建全局变量 x。所以只执行第二个函数的时候就会抛出
ReferenceError异常。