此问题特定于名为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"
首先执行两个控制器commonController
和contextController
。commonController
并注册需要访问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)
。