Javascript代码语义

Moh*_*mad 4 javascript semantics

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

当我运行这段代码时,myVar(第一次宣布)取值img.parent('a').length > 0并成为false或者true取决于具体情况.

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

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

CMS*_*CMS 7

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

第二个问题:不,你不是第二次重新宣布 Y,实际上Y任何任务之前定义的,它被提升到其封闭范围的顶部.

这是var您的代码中的实际行为:

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

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

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

var Y = 'foo';
(function () {
  alert(Y); //alerts `undefined`
  var Y;
})();
Run Code Online (Sandbox Code Playgroud)

如您所见,它位于该函数中alertvar声明之前,但由于var语句被提升,因此Y在执行变量实例化过程之前,将在执行之前设置此新范围中的变量.

最直接的方法是宣布和分配myVar:

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

if (myVar) {
  Y = 1;
} else {
  Y = 2;
}
// Or Y = myVar ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)

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

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