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

how can a function move at the top of the scope in which it is defined

本文关键字:作用域 顶部 移动 定义 函数      更新时间:2023-09-26

我正在阅读这本书 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>

现在根据这本书,它清楚地指出:

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

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

我的问题

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');
}