简单的例子:
主要是 声明提前的问题。
<!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('有点晕');
上面的例子,引入了一个概念:方法链;
当方法的返回值是个对象,这个对象还可以在调用它的方法。这种方法调用序列中每次的调用结果都是另一个表达式的组成部分。