此问题特定于名为isDefined的angular.isDefined()。如果传递给它的变量未定义而不是抛出未捕获的错误,我们不希望它找到一种返回false的方法。我正在寻找typeof运算符的等效角度来检测未定义的变量。在下面的示例中,未定义x并且typeof x不会引发任何Uncaught ReferenceError: x is not defined错误。如果我使用过angular.isDefined我会收到一个not defined error

 if(typeof x != 'undefined')
     alert("defined");
 else
      alert("undefined");


如果x未定义,angular.isDefined(x)抛出Uncaught ReferenceError: x is not defined

  if(angular.isDefined(x)) // throws error because x is not defined
     alert("defined");
 else
      alert("undefined");




     var x;
      if(angular.isDefined(x)) // does not throw error as x is defined though not **initialiased**
         alert("defined");
      else
         alert("undefined");


是否有typeof x !='undefined'的替代方法。让我解释一下我如何结束这种情况。我在不允许修改的js文件中具有createContext()函数,并且此函数定义了context="something useful"首先执行两个控制器commonControllercontextControllercommonController并注册需要访问context的自定义事件处理程序。然后commonController执行调用createContext()的时间。有时甚至取决于执行时间,具体取决于执行时间。 createContext()被调用。eventHadler被触发并且将尝试访问尚未定义的变量。除createContext()之外,我无法在其他任何地方致电contextController

最佳答案

正如您现在在@squiroid的答案中的注释中所阐明的那样,您的canvasDesign函数如下所示:

canvasDesign = function() {
    var canvas1 = document.getElementById("canvas1");
    if(canvas1 != null) context1 = canvas1.getContext('2d');
}


该函数正在创建implicit global variable(因为它未在var上使用context1)。

这是一个不好的做法,在ES5严格模式下是禁止的,正确的做法是修复代码以停止使用反实践。如果这不是一个选择,则最好的选择是继续使用typeof context1 === 'undefined'。正如this question所阐明的那样,创建通用函数来检查变量是否存在是不可能的。

另外两个选择:


使用angular.isDefined(window.context1)。这将允许您检查全局变量而不会引发错误,但是如果在某个时候将变量设置为非全局变量,则此方法将中断。
在所有功能之外,将var context1;放在文件顶部。这将确保至少声明该变量,并允许您安全地调用angular.isDefined(context1)

10-06 04:17