这个对象的范围是什么
我有下面的代码片断,它使用'事件' 我的开发人员争辩说'var事件'的范围被限制为'如果'条件。 这是真的。我怎样才能使这是一个更好的代码这个对象的范围是什么
function prepForDrag(obj, event) {
if(event= "undefined"){
var event=obj || window.event;
}
if (event.altKey) {
showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);
var thisForm = eval('document.${formName}');
// ...
enableDragState(obj);
disableClickEditHandler(obj); ## remove 'normal' line sched click handling in dd mode
}
}
这是不正确的。在JavaScript中有无块范围,只有功能范围*。在函数中引入的所有变量都被提升到函数的顶部。
所以这个代码:
function prepForDrag(obj, event) {
if (event = "undefined") {
var event = obj || window.event;
}
// ...
}
得到一定程度的解释是这样的:
function prepForDrag(obj, event) {
if (event = "undefined") {
event = obj || window.event;
}
// ...
}
由于Marcel Korpel的指出,声明变量event
在这种情况下没有必要,因为event
已经是一个局部变量因为它是一个函数参数。有关更详细的信息,请阅读Ben Cherry的文章JavaScript Scoping and Hoisting。
不过在代码中还有两个额外的问题。
在此条件下,你使用的
=
赋值运算符,而不是==
比较操作。所以病情总是评估为真。如果要检查是否给出函数参数,请使用
typeof event == 'undefined'
语句。
我恐怕这里还有一个问题。这种情况的目的是什么?请问obj
与event
有什么关系?现代浏览器将事件对象作为参数传递给事件处理函数,但是some do not。为了避免该问题,下面的模式一般用:
function prepForDrag(e) {
var event = e || window.event;
// ...
}
* NB:有在JavaScript 1.7,其提供内部功能块范围引入let
statement。目前it's only supported in Firefox。
这仍然是不完全正确的:因为'事件'已经一个给'prepForDrag'的参数,它已经具有本地范围,并且不需要使用'var'声明变量。你最后一个标准化Event接口的例子是不正确的:Event接口作为* first *参数传递给一个事件处理程序,所以在这种情况下'obj'将保存Event接口,'e'永远不会。 – 2010-09-13 14:18:33
@Marcel Korpel:你是对的。感谢您指出。 – 2010-09-13 14:38:54
JavaScript没有块范围(除catch
块中的异常变量),所以在你的情况,event
变量函数范围内。您可以做的最好的方法是使用新值重新指定event
,或者可以使用其他变量名称。
由于event
已经是prepForDrag
的一个参数,其范围是本地的功能。
但你if
条件是错误的:
if(event= "undefined")
这就赋予"undefined"
到event
和计算结果为true
。你或许应该使用
if (typeof event == "undefined")
或(我想你想要的是)
function prepForDrag(event) {
event = event || window.event;
if (event.altKey) {
showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);
var thisForm = eval('document.${formName}');
................................
enableDragState(obj);
disableClickEditHandler(obj); // remove 'normal' line sched click handling in dd mode
}
}
顺便说一句,你为什么eval
荷兰国际集团document.${formName}
?
@Korpel:这是非常古老的(5年)code.never接触/改造,除非面临问题。这一个是FF兼容性问题。因此,评估基本上是阅读表格数据,当然这些数据很差劲:-( – GustyWind 2010-09-14 12:39:54
这篇文章将是有趣的:http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop/ – spender 2010-09-13 13:22:23