繁体   English   中英

javascript,如果没有定义则让 function

[英]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语句中对它的引用是到一个未定义的全局变量。

此外,如果您的变量只是undefinedfunction ,则无需测试其类型,因为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() { } ,被提升(即在同一范围内声明和使用你想要的地方)。

除了李戈达德的回答。 您可以考虑了解letvar之间的区别。 最关键的区别是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM