我在chrome开发者控制台中定义了以下功能 -
let splitNumber=function(num){
let arr=[];
arr=num.toString().split("");
return arr};
在此之后,我尝试使用此命令从控制台范围中删除此功能 -
delete window.splitNumber
> true
现在,如果我尝试使用相同的变量' splitNumber'再次在控制台中,我收到此错误 -
Uncaught SyntaxError: Identifier 'splitNumber' has already been declared
有人可以帮我理解我在这里做错了吗? 如果问题不明确,请告诉我。
答案 0 :(得分:2)
由于函数是使用let
声明的,delete
不会将其删除。
但是,它确实返回true
,因为let
在全局范围内的工作方式。
delete
var
,let
和const
创建了无法使用delete
运算符删除的不可配置属性。
使用
let
或const
声明的任何属性都无法从定义它们的作用域中删除。
如果属性不可配置,因此无法删除,delete
将返回false
。但是,在这种特殊情况下,它会返回true
。
delete
如果>强删除后属性不存在,则返回true
。这意味着如果删除成功,或者首先不存在该属性,它可以返回true
。
在全局范围上使用let
声明的变量不会在全局对象上创建属性,因为使用var
声明的变量可以。 (See accepted answer, under Global heading.)因此delete
返回true
,因为splitNumber
不存在为window
对象的属性。
答案 1 :(得分:2)
使用let
或const
声明变量时,它不会添加到window
对象中。
您尝试删除splitNumber
对象上的window
,因为它在window
上无法生效。
splitNumber
仍会退出,当您尝试重新定义它时会抛出错误。
答案 2 :(得分:0)
在同一函数或块范围内重新声明相同的变量会引发SyntaxError。
if (x) {
let foo;
let foo; // SyntaxError thrown.
}
在ECMAScript 2015中,让绑定不受变量提升的约束,这意味着让声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量将具有未定义的值)。变量位于"临时死区"从块的开始直到处理初始化。
阅读{{3}}了解更多信息。