我有以下代码片段,它使用'event' 我的开发人员认为'var event'的范围仅限于'if'条件。 真的吗。我怎样才能使这个代码变得更好
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
}
}
答案 0 :(得分:10)
那不是真的。在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;
// ...
}
* 注意:JavaScript 1.7中引入了let
statement,它在函数内部提供了块范围。目前it's only supported in Firefox。
答案 1 :(得分:6)
由于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
}
}
BTW,您为什么eval
document.${formName}
?
答案 2 :(得分:2)
JavaScript没有块作用域(catch
块内的异常变量除外),因此在您的情况下,event
变量具有函数作用域。您可以做的最好的事情是使用新值重新分配event
,或者使用其他变量名称。