以前是玩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就不会被每次点击都重新定义了。
------解决方案--------------------
var game = {action: null};
function setAction(b){
if(!setAction.doNothing){
setAction.doNothing = function(){
}