大家好,欢迎来到IT知识分享网。
JS定义函数
- 方式有两种:一种是函数声明,另一种就是函数表达式
函数声明
- 函数声明可以定义命名的函数变量
- 变量声明必须以“function”开头。
- 函数名在自身作用域和父作用域内是可获取的。
- 具有函数声明提升
函数表达式
- 将函数定义为表达式语句(通常是变量赋值)的一部分。
- 通过函数表达式定义的函数可以是命名的,也可以是匿名的。
- 函数表达式不能以“function”开头。
- 函数名在作用域外是不可获取的。
// 函数声明 //关于函数声明,它的一个重要特征就是函数声明提升 fname() function fname() { // 函数体 console.log("hi"); } // 函数表达式 // fn();// 出错: fn is not a function var fn = function () { console.log("hello"); }
递归
- 递归函数是在一个函数通过名字调用自身的情况下构成的
-
arguments.callee 是一个指向正在执行的函数的指针
/* 递归 */ // 实现一个经典的递归阶乘函数 function factorial(num) { if (num <= 1) { return 1; } else { // return num * factorial(num - 1); // 改进 知道,arguments.callee 是一个指向正在执行的函数的指针 return num * arguments.callee(num - 1) } } // 如果函数赋予另一个变量,再factorial = null 会出错 // 改进 知道,arguments.callee 是一个指向正在执行的函数的指针 var anotherFactorial = factorial; factorial = null; // console.log(anotherFactorial(4)); //出错! factorial is not a function console.log(anotherFactorial(4)); //24 /* 但在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误 改进: */ var factorial2 = (function f(num) { if (num <= 1) { return 1; } else { return num * f(num - 1); } }); console.log(factorial2 instanceof Function);//true console.log(typeof(factorial2));//function var anotherFactorial2 = factorial2; factorial2 = null; console.log(anotherFactorial2(4));//24
以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数
赋值给了另一个变量,函数的名字f 仍然有效,所以递归调用照样能正确完成。
闭包
- 闭包是指有权访问另一个函数作用域中的变量的函数
- 创建闭包的常见方式,就是在一个函数内部创建另一个函数
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32110.html