Javascript 函数如何在定义它的作用域的顶部移动

Javascript 函数如何在定义它的作用域的顶部移动,javascript,function,scope,Javascript,Function,Scope,我正在读《javascript:the Good Parts》(javascript:the Good Parts),在函数语句与函数表达式的对比下,第B.9节。有一句话是这样说的 功能语句以提升为准。这意味着 无论函数放置在何处,它都会移动到 定义它的范围。这放宽了以下要求: 函数应该在使用前声明,我认为这会导致 马虎 根据这个,我做了一个简单的实验如下: <html> <script type="text/javascript"> var x = function

我正在读《javascript:the Good Parts》(javascript:the Good Parts),在函数语句与函数表达式的对比下,第B.9节。有一句话是这样说的

功能语句以提升为准。这意味着 无论函数放置在何处,它都会移动到 定义它的范围。这放宽了以下要求: 函数应该在使用前声明,我认为这会导致 马虎

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

<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>

var x=函数(){
警报;
var s=函数(){
返回“sanmevg”;
}
};  
点击这里
根据这本书,它清楚地指出:

它将被移动到页面的顶部 定义它的范围。这放宽了以下要求: 函数应在使用前声明

因此,这意味着当单击该按钮时,应该会出现一个
警报
sanmveg
。但结果出乎意料,它返回
未定义的

我的问题 1)我是否应该把道格拉斯·克罗克福德(Douglas Crockford)写的那些陈述,在某些特殊情况下是正确的(如果是的话,请告诉我这些情况)

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

3)我的实验做错了什么吗



谢谢你的回答

因为这不是函数声明:

var s = function(){
    return 'sanmevg'; 
}
它是分配给变量的匿名函数。将其更改为该选项,它将工作:

function s(){
    return 'sanmevg'; 
}

如所述:


“请注意,
var s
将被提升。这就是为什么
alert()
显示
undefined
而不是一个错误。但是分配的将保留在原来的位置。”


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

函数声明被挂起,这就是为什么您可以在定义它的位置和阅读内容上面调用函数的原因

function myFunction(){
  alert('myFunction');
}
但是,函数表达式是您键入的。声明的变量被挂起,但函数赋值保持不变

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

注意,
var s
将被提升。这就是为什么
警报()。但是被分配的任务将留在原处。@phylax我认为这是一个重要的提示,我可以把它包括在答案中吗?好的,谢谢。。。顺便说一下,从您的行
来看,这是一个分配给变量的匿名函数
我可以写
var s=function s(){..}
,因为非匿名函数被分配给variable@anni是的,你可以!感谢@Brad Larson的编辑