Javascript代码语义

时间:2010-05-29 21:41:35

标签: javascript semantics

if(myVar = img.parent('a').length > 0){
    var Y = 1;
}else{
    var Y = 2;
}

当我运行此代码时,myVar(第一次宣布)取img.parent('a').length > 0的值,并根据具体情况变为falsetrue

第一个问题:
这是定义 myVar 的正确方法吗?

第二个问题:
我是第二次定义 Y 吗?我的第二个'var'超出了吗? 即我应该写Y = 2;

1 个答案:

答案 0 :(得分:7)

第一个问题:在if语句的条件下使用赋值的IMO可能会引起混淆,如果先前未使用myVar语句声明var它可能会成为全局变量。

第二个问题:不,你不是re-declaring Y第二次,实际上Y在任何作业之前定义了,它是悬挂到其封闭范围的顶部。

实际上var在您的代码中的表现如下:

var Y; // declared and initialized with `undefined`

if (myVar = img.parent('a').length > 0) {
  Y = 1; // assignment
} else {
  Y = 2; // assignment
}

您可以使用以下示例观察此行为:

var Y = 'foo';
(function () {
  alert(Y); //alerts `undefined`
  var Y;
})();

如您所见,alert位于该函数中的var声明之前,但由于var语句已提升,因此YVariable Instantiation进程发生时,在执行之前设置来自此新范围的变量。

最直接的方法是声明并分配myVar

var Y, myVar = img.parent('a').length > 0;

if (myVar) {
  Y = 1;
} else {
  Y = 2;
}
// Or Y = myVar ? 1 : 2;

甚至更短,在一个var声明中:

var myVar = img.parent('a').length > 0,
    Y = myVar ? 1 : 2;
//...