js的function理解
我们写一个函数,只不过是创建了一个function类型的实体。
<script type="text/javascript" language="javascript"> function MyFunc() { alert('hello'); } alert(typeof (MyFunc))//输出function </script>
上面写法称之为“定义式”,改为“变量式”就更容易理解
<script language="javascript" type="text/javascript"> var MyFunc = function () { alert('hello'); } alert(typeof (MyFunc)); //输出function </script>
返回的结果是一样的,写法等价,内部实现相同,从这里我们可以看出JS函数只是命了名的变量,类型是function,值是函数的代码体。由此,函数完全可以当做变量来使用。
<script language="javascript" type="text/javascript"> var MyFunc = function () { alert('hello'); } MyFunc(); //输出hello MyFunc = function () { alert('funs'); } MyFunc(); //输出funs </script>
由上面可以看出函数被当做变量来使用了,随意赋值。看看定义式
<script language="javascript" type="text/javascript"> function MyFunc() { alert("hello"); } MyFunc(); function MyFunc() { alert("funs"); } MyFunc(); </script>
两次输出的结果都是funs,奇怪第一个为什么不是hello了,两个完全相同的函数MyFunc()在其他语言中是错误的,js中是可以的。其实js引擎不是一行一行的执行的,而是一段一段的执行的,定义式函数会被优先提出来执行,执行完后才会按顺序执行其他代码,所以第一个MyFunc()的逻辑会被第二个覆盖。结果就都是funs。如果写在两个<script>标签中结果又不一样了。
<script language="javascript" type="text/javascript"> function MyFunc() { alert("hello"); } MyFunc(); </script> <script language="javascript" type="text/javascript"> function MyFunc() { alert("funs"); } MyFunc(); </script>
输出的结果是:hello,funs这个更说明了JS是一段一段的执行的。