Javascript 角度。定义为与类型
此问题特定于命名为isDefined的angular.isDefined()。如果传递给它的变量没有定义,而不是抛出一个未捕获的错误,我们不希望它找到返回false的方法。我正在寻找typeof操作符的角度等价物,以检测未定义的变量。在下面的示例中,Javascript 角度。定义为与类型,javascript,angularjs,Javascript,Angularjs,此问题特定于命名为isDefined的angular.isDefined()。如果传递给它的变量没有定义,而不是抛出一个未捕获的错误,我们不希望它找到返回false的方法。我正在寻找typeof操作符的角度等价物,以检测未定义的变量。在下面的示例中,x未定义且typeof x不会抛出任何未捕获的引用错误:x未定义错误。如果我使用了angular.isDefined我会已收到未定义的错误 if(typeof x != 'undefined') alert("defined"); el
x
未定义且typeof x
不会抛出任何未捕获的引用错误:x未定义
错误。如果我使用了angular.isDefined
我会已收到未定义的错误
if(typeof x != 'undefined')
alert("defined");
else
alert("undefined");
角度.isDefined(x)抛出未捕获引用错误:如果x未定义,则未定义x
if(angular.isDefined(x)) // throws error because x is not defined
alert("defined");
else
alert("undefined");
是否有一个角度替代x的类型!='未定义的“。让我解释一下这个场景是如何结束的。我有一个js文件中的
createContext()
函数,我不允许修改它。这个函数定义了context=“一些有用的东西”
我有两个控制器commonController
和contextController
首先执行commonController
并注册一个需要访问context
的自定义事件处理程序。然后commonController
执行调用createContext()的操作
。有时甚至在调用createContext()
之前,根据执行时间而定。eventHadler将被触发,并将尝试访问尚未定义的变量。我不能调用createContext()
除contextController
之外的任何其他地方。isDefined(obj)不能完全替代typeof
定义依据:
这清楚地表明它只是在后端使用typeof,但是引用严格的类型检查(!==不!=)
因此,在您的情况下,typeof工作,而angular.isDefined()不工作
PS:-根据您的要求,您可以使用typeof或angular.isDefined()。angular.isDefined(obj)不能完全替代typeof
定义依据:
这清楚地表明它只是在后端使用typeof,但是引用严格的类型检查(!==不!=)
因此,在您的情况下,typeof工作,而angular.isDefined()不工作
PS:-根据您的要求,您可以使用typeof或angular.isDefined()。您的问题“是否存在x的typeof的角度替代方案!='undefined'”没有意义
JavaScript(无论角度如何)的工作方式是,执行以下操作将是一个错误:
function foo(x){ return true; }
foo(a); // this will cause "Uncaught ReferenceError: a is not defined"
Angular的已定义
与其他函数一样,是一个函数,当使用未声明的变量调用时,会导致错误。您的问题“是否存在x的类型的角度替代方法!='undefined'
”没有意义
JavaScript(无论角度如何)的工作方式是,执行以下操作将是一个错误:
function foo(x){ return true; }
foo(a); // this will cause "Uncaught ReferenceError: a is not defined"
Angular的
已定义
与任何其他函数一样,是一个函数,当使用未声明的变量调用时,会导致错误。正如您现在在@squiroid的答案中的注释中所阐明的,您的canvasDesign
函数如下所示:
canvasDesign = function() {
var canvas1 = document.getElementById("canvas1");
if(canvas1 != null) context1 = canvas1.getContext('2d');
}
该函数正在创建(因为它没有在context1
上使用var
)
这是一种不好的做法,在ES5严格模式中是禁止的,正确的做法是修复代码以停止使用反实践。如果这不是一个选项,那么最好的选择是继续使用typeof context1===“undefined”
。正如澄清的那样,不可能创建一个通用函数来检查变量的存在
其他两种选择:
- 使用
。这将允许您在不抛出错误的情况下检查全局变量,但是如果在某个点上该变量变为非全局变量,这种方法将失败angular.isDefined(window.context1)
- 放置
var context1代码>位于文件顶部,在任何函数之外。这将确保至少声明了变量,并允许您安全地调用
angular.isDefined(context1)
画布设计功能如下所示:
canvasDesign = function() {
var canvas1 = document.getElementById("canvas1");
if(canvas1 != null) context1 = canvas1.getContext('2d');
}
该函数正在创建(因为它没有在context1
上使用var
)
这是一种不好的做法,在ES5严格模式中是禁止的,正确的做法是修复代码以停止使用反实践。如果这不是一个选项,那么最好的选择是继续使用typeof context1===“undefined”
。正如澄清的那样,不可能创建一个通用函数来检查变量的存在
其他两种选择:
- 使用
angular.isDefined(window.context1)
。这将允许您在不抛出错误的情况下检查全局变量,但是如果在某个点上该变量变为非全局变量,这种方法将失败
- 放置
var context1代码>位于文件顶部,在任何函数之外。这将确保至少声明了变量,并允许您安全地调用angular.isDefined(context1)
不,没有。但我看不出有什么不同的地方,因为变量可能总是会被声明。是的,我有一个场景,其中事件订阅块$on
中的代码正在访问另一个函数中定义的变量,该函数可能正在执行,但尚未完成执行。@Blackhole有一点不同,我检查了angular的文档。@DivyaMV这是不可能的,JavaScript是单线程的,因此,
上的$on将在需要访问的代码之前或之后执行。@DivyaMV根据函数是否执行,变量不会进入或超出范围(除非您将属性添加到窗口
obj