函数声明与函数表达式的不同
简单的例子:
主要是 声明提前的问题。
<!DOCTYPE html>
var demo={ speak:function(name){ return{ a:function z(name){ alert(name+'~\(≧▽≦)/~啦啦啦'); } } }, } demo.speak().a('有点晕');
<html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html> <script> // var tensquared=(function(x){ // alert(x*x); // }(10)) //函数声明: shengming(1); //可以正常读到函数,声明提前 //函数表达式: biaodashi(2); //报错 函数表达式要先声明再用 函数表达式.html:17 Uncaught TypeError: biaodashi is not a function //函数声明: function shengming(n){ alert(n); }; //函数表达式: var biaodashi=function(n){ alert(n); }; </script>
还有一点不同:函数定义表达式可以出现在javascript代码的任意地方,但是函数声明就不能出现在循环和条件判断中,或者try/cache/finally以及with语句中。
函数调用
1:普通函数调用:
function demo(x){ return x+1; } demo(2); //3
可以用来判定是否进入严格模式:
'use strict'; //进入严格模式 var strict=(function(){ if(!this) alert('严格模式'); else alert('非严格模式'); }())
2.当做方法调用:
var demo={ speak:function(name){ alert(name+'~\(≧▽≦)/~啦啦啦'); }, } demo.speak('小米');
方法调用与普通调用的区别 在于上下文;
方法调用还可以通过【】的形式:
var demo={ speak:function(name){ alert(name+'~\(≧▽≦)/~啦啦啦'); }, }
demo['speak']('小小');
3.更复杂点的:
var demo={ speak:function(name){ return{ a:function z(name){ alert(name+'~\(≧▽≦)/~啦啦啦'); } } }, } demo.speak().a('有点晕');
上面的例子,引入了一个概念:方法链;
当方法的返回值是个对象,这个对象还可以在调用它的方法。这种方法调用序列中每次的调用结果都是另一个表达式的组成部分。