1

这是我的代码

var a = this.innerHTML;

var b = 'blababibbaib';

if(a !== b)
    {
        c = a;
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

并使用 var

var a = this.innerHTML;

var b = 'blababibbaib';

if(a !== b)
    {
       var c = a; // here with the var it makes c undefined :-(
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

我这样做的原因是因为我想要一个 onclick 事件的函数,它会在原始和 var b 之间来回改变。真的只是为了好玩。

但是我不明白为什么当你在 c 变量前面添加 var 时,一旦你点击它就会使它变得未定义。有人会照亮我吗?

我猜它在函数中使用时与变量范围有关????

提前致谢 :-)

编辑:

好的,我这样做是为了用 var 声明它,但我仍然不确定为什么。

在函数之外,我在声明它之前添加了一个 if 检查 c

if(!c) var c = '';

但就像我说的那样,我仍然想听听发生了什么以及为什么谢谢:-)

编辑2:谢谢大家,现在阅读有关提升的信息。

我想我很困惑,似乎即使你也不需要检查 c 。想法可能很重要……哦,好吧。再次感谢

4

6 回答 6

4

第二个示例中发生的情况等价于:

var a = this.innerHTML;

var b = 'blababibbaib';

var c; // all "var" are hoisted to the top of a function body

if(a !== b)
    {
        c = a;
        return this.innerHTML = b;
    }
else
    {
        // local c variable not set yet - undefined
        return this.innerHTML = c;
    }

显然c这里是未定义的,因为它只有在未设置时才输出。我怀疑你真正想要的是:

var a; //This persists after the function is invoked

myelement.onclick = function () {
    if (!a) { // Only save the value if it isn't already set
        a = this.innerHTML;
    }
    var b = 'blababibbaib';

    if (this.innerHTML == b) {
        return this.innerHTML = a;
    } else {
        return this.innerHTML = b;
    }
};

你可以在这里看到它。

就第一个片段而言,它之所以有效,是因为 的值c不是函数的本地值,并且在调用后仍然存在。当您在函数体中分配或引用变量而不使用var关键字声明它时,它会自动引用window具有相同名称的属性。考虑以下:

window.c = "Hello, world.";

//Note how there is no local c variable;
//the c here refers to window.c
function test1(){
    alert(c);
}

//There is a c variable local to the 
//function, so the value alerted is not the value of window.c
function test2(){
    var c;
    alert(c);
}

test1(); // alerts "Hello, world."
test2(); // alerts "undefined"

在第一个片段中,只要 HTML 不是 ,您就将 的值window.c更改this.innerHTML"blababibbaib"。当值为 时 "blababibbaib"您依赖于window.c重置元素的innerHTML.

您可能想阅读 JS 中的提升以及隐式全局变量

于 2013-01-07T03:35:05.007 回答
1

没有var前缀c就成为一个全局变量,并且在所有范围内都可用。

JavaScript 仅具有函数范围,因此var将变量范围用于最近的函数上下文(如果未在函数内声明,则为全局范围)。

于 2013-01-07T03:35:03.340 回答
1

这可能是因为你的变量c只存在于 if 语句中,所以你需要这样做:

var a = this.innerHTML;

var b = 'blababibbaib';
var c;
if(a !== b)
    {
       var c = a; // here with the var it makes c undefined :-(
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

使用第一个代码,因为您没有使用var c,所以它是c一个全局变量。

于 2013-01-07T03:35:38.283 回答
0

按照您的逻辑,c 只会在 if 中设置,而不会在 else 中设置。所以如果c是一个存在于函数外部的全局变量,它可以在调用之间保持“状态”。如果你用varinside 声明它,那么它对每个调用都是本地的。

于 2013-01-07T03:34:50.297 回答
0

当您不为特定范围内的变量分配新内存时,它默认使用与父范围链匹配的变量。

使用 'var' 关键字会触发当前范围内的内存分配,否则会将值分配为 window 的成员,这在对函数的调用中是持久的。

于 2013-01-07T03:37:28.470 回答
0

这有点令人困惑,但是当您知道时应该很容易记住。var当您在定义变量时省略关键字时,该变量将附加到全局范围。这在编写良好的程序中通常是不受欢迎的,因为您有变量浮动,当范围到期时应该将其处理掉。

在您的情况下,当您var c = aif语句中添加时,即使 javascript 自动将变量提升到函数范围 - 即变量名称将存在 - 但在遇到代码行之前它不会为其分配值var c = a。默认情况下,任何未赋值的变量都会获得undefined状态。

当您省略 , 时varc将提升到全局范围,并且c只要您在页面上,全局状态就会保持该值。因此,回到该else子句,您将获得一个有效但旧的 . 值c

根据经验,没有定义的变量var不是一个好习惯,您应该定义在函数开头附近使用的所有变量,以避免与提升等混淆,特别是如果您来自 C/C++/爪哇背景。

于 2013-01-07T03:42:51.800 回答