angular.isDefined vs typeof

时间:2015-03-18 09:47:58

标签: javascript angularjs

此问题特定于angular.isDefined()被命名为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的自定义事件处理程序.then {{ 1}}执行调用commonController。有时甚至在调用createContext()之前执行时间。触发eventHadler并尝试访问尚未定义的变量。我无法在createContext()以外的其他任何地方拨打createContext()

3 个答案:

答案 0 :(得分:3)

正如您在@ 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)

答案 1 :(得分:2)

angular.isDefined(obj)不是typeof的完全替代。

根据doc定义:

function isDefined(value) {return typeof value !== 'undefined';}

这清楚地表示它只是在后端使用typeof但是使用引用严格类型检查(!== not!=)。

所以在你的情况下,typeof正在工作,而angular.isDefined()则没有。

PS: - 根据您的要求,您可以使用typeof或angular.isDefined()。

答案 2 :(得分:1)

你的问题"是否有typeof x !='undefined'"没有意义。

JavaScript(与Angular无关)的工作方式是执行以下操作会出错:

function foo(x){ return true; }
foo(a); // this will cause "Uncaught ReferenceError: a is not defined"

Angular' isDefined是一个函数,与任何其他函数一样,当使用未声明的变量调用时,会导致错误。