JS:如何防止 let 双重声明? / 判断是不是定义了 let 变量

Posted

技术标签:

【中文标题】JS:如何防止 let 双重声明? / 判断是不是定义了 let 变量【英文标题】:JS: How to prevent let double declaration? / determine if let variable is definedJS:如何防止 let 双重声明? / 判断是否定义了 let 变量 【发布时间】:2019-02-16 22:20:43 【问题描述】:

如果我打开 JS 控制台并写:

let foo;

之后:

let foo = "bar"

控制台显示(正确)

Uncaught SyntaxError: Identifier 'foo' has already been declared

现在...有时我需要在现有脚本中注入我的代码,而我没有工具来确定是否已经定义了 let 变量。

我尝试使用此代码,但 JS 范围和逻辑存在明显问题....(注释代码)

let foo; // Gloabl variable empty declare in a code far, far away 

console.log(foo); // undefined

console.log(typeof foo === "undefined"); // test that determinate if condition is true

if(typeof foo === "undefined")
    let foo = "test";
    console.log(foo); // return "test" this means that foo as a local scope only inside this if... 


console.log(foo); // return undefined not test!

// and .. if I try to double declaration... 
 let foo = "bar"; //error!

所以...如何防止双重“让”声明? / 如何判断一个 let var 是否被定义(声明?)

附言 使用“var”一切正常!!!

【问题讨论】:

var声明的变量具有函数作用域,并且被提升,不像let / const “现有脚本”是你写的? 请注意,这是一个语法错误,而不是运行时错误。你能解释一下你的sometimes I need to inject my code inside an existing script吗? 也许你可以把你的代码放在一个 iife 中,这样它就不会和其他的共享相同的范围? @JNF 我认为这不是我自己的代码。 【参考方案1】:

您可以为脚本定义范围。您仍然可以访问该范围内的外部变量。

let toto = 42;
let foo = "bar";
			
console.log(toto);
			
//Some added script

    let toto = "hello world !";
    console.log(toto);
    console.log(foo);

//back to main script
console.log(toto);

您仍然可以使用try - catch 以编程方式检查变量是否存在,但在try catch 范围内声明变量可能非常棘手

let existingVariable = "I'm alive !";

try

    console.log("existingVariable exists and contains : " + existingVariable);
    console.log("UndeclaredVariable exists and contains : " + UndeclaredVariable);

catch (ex)

    if (ex instanceof ReferenceError)
    
        console.log("Not good but I caught exception : " + ex);
    

console.log("Looks like my script didn't crash :)");

如果您不想创建新范围以确保您的变量不存在于现有脚本中,那么...在它们前面加上 let r1sivar_userinput

【讨论】:

return this: Uncaught SyntaxError: Identifier 'toto' has been declared 对不起(我在控制台中粘贴了两次),它的工作和帮助练习......但这不是一个解决方案,有一种模式来确定是否定义了 let var? 您的问题是如何防止双重“let”声明?,而不是如何确定一个 let var 是否已定义(声明?) @Cid,似乎问题是如何确定是否定义(声明)了一个 let var? @JNF 是的,因为他在我回答后编辑了他的问题

以上是关于JS:如何防止 let 双重声明? / 判断是不是定义了 let 变量的主要内容,如果未能解决你的问题,请参考以下文章

事件跟踪:如何防止双重加载analytics.js

如何在声明后确定 ES6 值是不是为 var / const / let? [复制]

258 关键字let

关于变量声明的var,let,const

如何检查 `let` 变量是不是已在 ES6 上声明?

为啥 Node.js 通常使用 'var' 而不是 'let'?