<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>函数表达式的应用</title>
</head>
<body>
<script type="text/javascript">
// 一、声明式(变量会提升,可以先使用再赋值)
function functionName1(arg0,arg1,arg2){
// 函数体
}
// 通过name属性访问函数名:只在Firefox、Safari、Chrome、Opera有效
console.log(functionName1.name)// functionName1
// 二、函数表达式(需先定义再使用)
//2.1 创建函数再赋值给变量
var functionName2 = function(arg0,arg1,arg2){
// 函数体
}
console.log(functionName2.name)// "" (匿名函数返回空字符串)
// 考虑到变量提升会在js程序中带来意想不到的结果,在条件语句中建议使用函数表达式
var sayHi;
var condition=true;
if(condition){
sayHi = function(){
alert("Hi!")
}
}else{
sayHi = function(){
alert('No')
}
}
// 2.2把函数作为其他函数的值返回(给对象排序)
function createCompareFunction(propertyName){
return function(obj1,obj2){
var val1 = obj1[propertyName];
var val2 = obj2[propertyName];
if(val1<val2){
return -1
}else if(val1>val2){
return 1
}else{
return 0;
}
}
}
//三、函数表达式 优化递归
//1、经典阶乘
function factorial(num){
if(num<=1){
return 1
}else{
return num*factorial(num-1)
}
}
//缺点如下
var anotherFacorial=factorial;
factorial = null;
console.log(anotherFacorial(6));//出错!!!"Uncaught TypeError: object is not a function"
// argments.callee指向正在执行的函数的指针(俗讲:代替函数名),可以解决此问题,实现对函数的递归调用
function factorial(num){
if(num<=1){
return 1
}else{
return num*arguments.callee(num-1)
}
}
var anotherFacorial=factorial;
factorial = null;
console.log(anotherFacorial(6)) // 720
// 严格模式下不能访问 arguments.callee,这时可以使用到 函数表达式解决
var factorial = (function f(num){
if(num<=1){
return 1
}else{
return num.f(num-1)
}
})
//四、关于this对象
var name = 'window';
var obj = {
name:'obj',
getNameFunc:function(){
var that = this;
return function(){
return that.name;
}
}
}
console.log(obj.getNameFunc()());// 'obj'
// this会发生变化的情况
var name2 = 'window2';
var obj2 = {
name2:'obj2',
getName:function(){
return this.name2;
}
}
console.log(obj2.getName());//obj2
console.log((obj2.getName)());//obj2
console.log((obj2.getName=obj2.getName)());//window2
</script>
</body>
</html>