从chrome开发者控制台删除JavaScript函数(使用let声明)

时间:2017-11-09 05:13:27

标签: javascript google-chrome ecmascript-6

我在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

有人可以帮我理解我在这里做错了吗? 如果问题不明确,请告诉我。

3 个答案:

答案 0 :(得分:2)

由于函数是使用let声明的,delete不会将其删除。

但是,它确实返回true,因为let在全局范围内的工作方式。

无法使用delete

删除不可配置的属性

varletconst创建了无法使用delete运算符删除的不可配置属性。

  

使用letconst声明的任何属性都无法从定义它们的作用域中删除。

如果属性不可配置,因此无法删除,delete将返回false。但是,在这种特殊情况下,它会返回true

为什么它会返回true?

delete如果强删除后属性不存在,则返回true。这意味着如果删除成功,或者首先不存在该属性,它可以返回true

在全局范围上使用let声明的变量不会在全局对象上创建属性,因为使用var声明的变量可以。 (See accepted answer, under Global heading.)因此delete返回true,因为splitNumber不存在为window对象的属性。

答案 1 :(得分:2)

使用letconst声明变量时,它不会添加到window对象中。

您尝试删除splitNumber对象上的window,因为它在window上无法生效。

splitNumber仍会退出,当您尝试重新定义它时会抛出错误。

答案 2 :(得分:0)

在同一函数或块范围内重新声明相同的变量会引发SyntaxError。

if (x) {
  let foo;
  let foo; // SyntaxError thrown.
}

在ECMAScript 2015中,让绑定不受变量提升的约束,这意味着让声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量将具有未定义的值)。变量位于"临时死区"从块的开始直到处理初始化。

阅读{{3}}了解更多信息。