0

我正在尝试使用 YUI3 测试框架来测试是否存在已声明、已定义的函数。在 Safari 和 FireFox 中,尝试使用 isNotUndefined、isUndefined 或 isFunction 会失败。我希望那些抛出一个可以由测试框架处理的异常。

 Y
 Object
 Y.Assert
 Object
 Y.Assert.isNotUndefined(x, "fail message")
 ReferenceError: Can't find variable: x
 Y.Assert.isUndefined(x, "fail message")
 ReferenceError: Can't find variable: x
 Y.Assert.isFunction(x, "fail message")
 ReferenceError: Can't find variable: x

但是,相反,我从来没有看到失败消息,其余的测试也没有运行,因为解释器妨碍了......这不会破坏这些功能的目的,还是我误解了框架?

我的直觉告诉我,鉴于上面的代码并且只有上面的代码,

  Y.Assert.isUndefined(x, "fail message")

应该继续没有错误(因为 x 未声明)和

  Y.Assert.isNotUndefined(x, "fail message")

应该记录消息“失败消息”(因为 x 未声明)。

然而,由于 ReferenceError,没有办法(使用那些 YUI3 方法)来测试未声明的对象。相反,我留下了一些非常丑陋的断言代码。我无法使用

 Y.Assert.isNotUndefined(x)
 ReferenceError: Can't find variable: x

或者

 Y.assert( x !== undefined )
 ReferenceError: Can't find variable: x

这让我有了

 Y.assert( typeof(x) !== "undefined" ) // the only working option I've found
 Assert Error: Assertion failed.

这比可读性差得多

 Y.Assert.isNotUndefined(x)

再次,我问:这不会破坏这些功能的目的,还是我误解了框架?

所以

 x

未声明,因此不可直接测试,而

 var x;

声明它,但未定义。最后

 var x = function() {};

被声明和定义。

我认为对我来说缺少的是轻松说出的能力

 Y.Assert.isNotUndeclared(x);

-会

4

2 回答 2

2

好的,昨天有点晚了猜我现在明白你的问题了,你要做的是检查一个变量是否被定义,对吧?

这样做的唯一方法是typeof x === 'undefined'.

typeof运算符允许与它一起使用不存在的变量。

所以为了让它工作,你需要上面的表达式并将它插入到一个正常的true/false断言中。

例如(没用过YUI3):

Y.Assert.isTrue(typeof x === 'undefined', "fail message"); // isUndefined
Y.Assert.isFalse(typeof x === 'undefined', "fail message"); // isNotUndefined
于 2011-01-09T17:07:47.153 回答
0

背景:我希望能够区分:

x // undeclared && undefined
var x; // declared && undefined
var x = 5; // declared && defined

所以,这里的挑战是 JavaScript 不能轻易区分前两种情况,我希望能够这样做以用于教学目的。经过大量的玩耍和阅读,似乎确实有办法做到这一点,至少在网络浏览器和全局变量的上下文中(没有很大的限制,但是......):

function isDeclared(objName) {
  return ( window.hasOwnProperty(objName) ) ? true : false;
}

function isDefined(objName) {
  return ( isDeclared(objName) && ("undefined" !== typeof eval(objName)) ) ? true : false;
}

我意识到使用 eval 可能是不安全的,但是对于我将使用这些函数的严格控制的上下文,没关系。所有其他人,请注意并查看http://www.jslint.com/lint.html

isDeclared("x")  // false
isDefined("x")   // false

var x;
isDeclared("x")  // true
isDefined("x")   // false

var x = 5;
isDeclared("x")  // true
isDefined("x")   // true
于 2011-02-01T22:27:10.053 回答