Javascript 这个对象的范围是什么
我有以下使用“event”的代码片段 我的开发伙伴们认为,“var事件”的范围仅限于“if”条件。 这是真的吗。我怎样才能使它成为更好的代码Javascript 这个对象的范围是什么,javascript,scope,Javascript,Scope,我有以下使用“event”的代码片段 我的开发伙伴们认为,“var事件”的范围仅限于“if”条件。 这是真的吗。我怎样才能使它成为更好的代码 function prepForDrag(obj, event) { if(event= "undefined"){ var event=obj || window.event; } if (event.altKey) { showShiftEditable(objCurrentEdi
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没有块作用域(除了
catch
块中的异常变量),因此在您的情况下,event
变量具有函数作用域。您所能做的最好的事情就是用新值重新分配事件,或者使用另一个变量名。这不是真的。在JavaScript中,没有块作用域,只有函数作用域。函数中引入的所有变量都被提升到函数的顶部
所以这个代码:
function prepForDrag(obj, event) {
if (event = "undefined") {
var event = obj || window.event;
}
// ...
}
得到如下解释:
function prepForDrag(obj, event) {
if (event = "undefined") {
event = obj || window.event;
}
// ...
}
正如所指出的,在这种情况下,声明变量event
是不必要的,因为event
已经是一个局部变量,因为它是一个函数参数。欲知更多详情,请阅读本·切里的文章
然而,代码中还有两个额外的问题
在这种情况下,您使用了=
赋值运算符而不是=
比较运算符。因此,条件的计算结果始终为true
如果要检查是否给出了函数参数,请使用typeof event==“undefined”
语句
恐怕还有一个问题。条件的目的是什么?参数obj
是否与事件
有关?现代浏览器将事件对象作为参数传递给事件处理程序函数。为避免该问题,通常使用以下模式:
function prepForDrag(e) {
var event = e || window.event;
// ...
}
*注意:JavaScript 1.7中引入了一个在函数内部提供块作用域的函数。当前。由于事件
已经是prepForDrag
的一个参数,它的作用域是函数的局部
但是如果您的条件不正确:
if(event= "undefined")
这将“未定义”
分配给事件
,并计算为真
。你可能应该使用
if (typeof event == "undefined")
或者(我认为你想要的是)
顺便说一句,你为什么要eval
ingdocument.${formName}
?这篇文章很有意思:这仍然不完全正确:因为event
已经是prepForDrag
的一个参数,它已经有了局部范围,不需要使用var
声明变量。上一个规范化事件接口的示例不正确:事件接口作为第一个参数传递给事件处理程序,因此在这种情况下,obj
将保存事件接口,e
从不保存。@Marcel Korpel:你完全正确。谢谢你指出这些问题。@Korpel:这是非常古老的(5年)代码。除非遇到问题,否则从未接触过/改造过。这是一个兼容性问题。因此,评估基本上是读取表单数据,这当然是糟糕的记录:-(
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
}
}