如何将函数移动到定义它的作用域的顶部

时间:2014-04-11 15:23:10

标签: javascript function scope

我正在阅读功能声明与功能表达式 B.9 下的 javascript : The Good Parts 一书。有一条线说

  

函数语句需要提升。这意味着   无论函数放在何处,它都会移动到顶部   它的定义范围。这放宽了要求   函数应该在使用之前声明,我认为这会导致   草率

所以根据这个,我做了一个简单的实验如下:

<html>
<script type="text/javascript">


var x = function(){

    alert(s);

    var s = function(){
        return 'sanmevg'; 
    }

};  
</script>   

<body>


<button onclick="x();">click here</button>  

</body></html>

现在根据这本书,它明确指出:

  

它被移到了顶部   它的定义范围。这放宽了要求   函数应在使用前声明

所以这意味着当点击该按钮时,应该有一个alertsanmveg。但结果出乎意料,它返回Undefined

我的问题

1)我应该接受Douglas Crockford写的那些陈述,纠正一些特殊情况(如果是,那么它会非常友好地告诉我那些情况)?

2)它是否反映了其他一些含义?

3)我在实验中做错了什么?


感谢您的所有答案!

2 个答案:

答案 0 :(得分:0)

因为那不是函数声明:

var s = function(){
    return 'sanmevg'; 
}

它是一个分配给变量的匿名函数。将其改为,它将起作用:

function s(){
    return 'sanmevg'; 
}

Phylax所述:

  

&#34;请注意 var s 将被悬挂。这就是 alert() 显示 undefined 而不是错误的原因。但是分配的将保持原样。&#34;

答案 1 :(得分:0)

您键入的是函数表达式而不是函数声明。

函数声明被提升,这就是为什么你可以调用上面定义它的函数以及你正在阅读的内容。

function myFunction(){
  alert('myFunction');
}

但是,函数表达式是您键入的内容。声明的变量被提升,但功能分配仍然存在。

var myFunction = function(){
  alert('myFunction');
}