此问题特定于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"
,我有两个控制器commonController
和contextController
。commonController
首先执行并注册一个需要访问context
的自定义事件处理程序.then {{ 1}}执行调用commonController
。有时甚至在调用createContext()
之前执行时间。触发eventHadler并尝试访问尚未定义的变量。我无法在createContext()
以外的其他任何地方拨打createContext()
。
答案 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
是一个函数,与任何其他函数一样,当使用未声明的变量调用时,会导致错误。