日期:2014-05-16  浏览次数:20380 次

javascript中的“方法”过了一会就不等于自身了,怎么理解?
以前是玩c# winform的,感觉“函数”肯定总是不变的才对。。。但今天遇到个奇怪的问题,有没有高手从原理方面解释一下:为什么刚赋值时两个变量指向同一函数,过了一会就不指向同一函数了。。。原代码有点长,我已经尽量从实际环境中把没用的东西都去掉了。。。点两下checkbox,预期结果是两次提示true,结果第2次提示false


<!DOCTYPE html>
<html>
<head><title></title></head>
<body>
<script>
    var game = {action: null};
    function setAction(b)
    {
        function doNothing()
        {
        }

        if (b)
        {
            game.action = doNothing;
            alert(game.action == doNothing)
        }
        else
        {
            alert(game.action == doNothing);    //返回false,太奇怪了
            game.action = null;
        }
    }
</script>
<label for="chk">show time</label><input id="chk" type="checkbox" onchange="setAction(this.checked)"/>
</body>
</html>

------解决方案--------------------
下面这样就是true了。

var game = {action: null};
function doNothing()
{
}
function setAction(b)
{
    if (b)
    {
        game.action = doNothing;
        alert(game.action == doNothing)
    }
    else
    {
        alert(game.action == doNothing);    //返回false,太奇怪了
        game.action = null;
    }
}

------解决方案--------------------
这是因为,在JavaScript中,变量的作用域通常按函数划分,
函数doNothing()定义在函数setAction()内部,其作用域也在setAction()内部,
每当点击checkbox就会执行setAction(),而每当执行setAction(),
就是重新定义一个doNothing()。这个doNothing()虽然与之前的函数名函数体都一样,
但在内存中实际上是不同的。而game.action从第一点击checkbox开始,
以后每次点击,game.action就一直指向第一次点击定义的doNothing。

所以,1楼将doNothing()的定义放在函数setAction()的外部,
这样,doNothing就不会被每次点击都重新定义了。
------解决方案--------------------
引用:
引用:这是因为,在JavaScript中,变量的作用域通常按函数划分,
函数doNothing()定义在函数setAction()内部,其作用域也在setAction()内部,
每当点击checkbox就会执行setAction(),而每当执行setAction(),
就是重新定义一个doNothing()。这个doNothing(……


var game = {action: null};
    function setAction(b){
        if(!setAction.doNothing){
            setAction.doNothing = function(){