![](/img/trans.png)
[英]Javascript: Should an argument passed to a function be defined as 'let', 'const' or 'var'?
[英]javascript, let function if not defined
每次打开模式时,我都会通过 ajax 加载一些 html + js,如下所示:
var loadModalJs = function() {
...
}
$(function() { loadModalJs(); });
它适用于var
,但如果我用let
替换var
,当模式关闭然后再次打开时,我得到Identifier 'loadTabJs' has already been declared
我尝试了这样的事情,但没有成功:
if(typeof loadModalJs === 'undefined') {
let loadModalJs = function() {
...
};
}
loadModalJs(); // ReferenceError: loadModalJs is not defined
我不喜欢使用 var,因为我的 IDE 抱怨使用“'var' 而不是 'let' 或 'const'”......但它们似乎都不起作用......我该怎么办?
您放入评论的错误是正确的:您在任何时候都没有在 scope 中定义变量 - 您在if
子句中定义它,并且它在该子句之外不可用,您在if
语句中对它的引用是到一个未定义的全局变量。
此外,如果您的变量只是undefined
或function
,则无需测试其类型,因为undefined
评估为假。
let loadModalJs;
// ...your other code here...
// This bit within the function/scope run multiple times:
if (!loadModalJs) {
loadModalJs = function() {
...
};
}
if (loadModalJs) {
loadModalJs();
}
如果您使用var
而不是let
,您的第二个片段可能会起作用。
if
创建了自己的块{}
:
let
仅限于直接块{}
。var
仅限于直接的 function 块{}
(如果没有函数,则为全局)。例如:
if (true) { var x = "It'll work outside the if."; } console.log(x);
作为附加提示,您可能要小心在 javascript 中“创建”函数的方式:
let myFunction = function() { }
,处于自上而下的控制流(即先定义,然后使用)之下。function myFunction() { }
,被提升(即在同一范围内声明和使用你想要的地方)。 除了李戈达德的回答。 您可以考虑了解let
和var
之间的区别。 最关键的区别是:
let 允许您声明仅限于使用它的块语句或表达式的 scope 的变量,这与 var 关键字不同,后者全局或局部地声明变量到整个 function,而不管块 Z31A1FD140BE4BEF2D18ZA21。 - MDN 文档
这看起来是使用保护/默认子句的好机会:
let f = function(){ console.log('f is defined'); } let g; g = f || function() { console.log('f was NOT defined'); } g(); f = null; g = f || function() { console.log('f was NOT defined'); } g();
有点扭曲:
let f, g; for (let i=0; i<8; i++){ g = f || function() { console.log('f was NOT defined'); } g(); f = (f)?undefined:function(){console.log('f is defined');}; }
所以在你的情况下,这将是:
let guardedModal = loadModalJs || function() {
// your code here
}
guardedModal();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.