翼度科技»论坛 编程开发 JavaScript 查看内容

第122篇: JS函数一些基本概念

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
好家伙,本篇为《JS高级程序设计》第十章“函数”学习笔记
 
1.函数的三种定义方式:函数表达式、函数声明及箭头函数

函数声明:
  1. <strong>function sum(a) {
  2. return a + 1;
  3. } </strong>
复制代码
函数表达式:
  1. <strong>let sum= function(a){<br> return a + 1; <br>} </strong>
复制代码
 
箭头函数:
  1. <strong>let sum = (a) => {
  2. return a + 1;
  3. } </strong>
复制代码
 
以函数声明方式声明的函数存在"函数声明提升",
在执行代码时,JavaScript 引擎会先执行一遍扫描, 把发现的函数声明提升到源代码树的顶部。
因此即使函数定义出现在调用它们的代码之后,引擎也会把 函数声明提升到顶部。
而函数表达式这么做会报错(箭头函数同样报错)

 
 
 代码如果没有执行到函数表达式的那一行,那么执行上下文中就没有函数的定义
 
 
 
2.函数名

函数名是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为。
  1. <strong>function sum(num1, num2) {
  2. return num1 + num2;
  3. }
  4. console.log(sum(10, 10)); // 20
  5. <br>let anotherSum = sum; <br>
  6. console.log(anotherSum(10, 10)); // 20
  7. <br>sum = null; <br>
  8. console.log(anotherSum(10, 10)); // 20 </strong>
复制代码
以上代码定义了一个名为 sum()的函数,用于求两个数之和。
然后又声明了一个变量 anotherSum, 并将它的值设置为等于 sum。
注意,使用不带括号的函数名会访问函数指针,而不会执行函数。
此时, anotherSum 和 sum 都指向同一个函数。
调用 anotherSum()也可以返回结果。把 sum 设置为 null 之后,就切断了它与函数之间的关联。
而 anotherSum()还是可以照常调用,没有问题。(有意思,之前不清楚)
 
ECMAScript 6 的所有函数对象都会暴露一个只读的 name 属性,其中包含关于函数的信息。
多数情 况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。
即使函数没有名称, 也会如实显示成空字符串。
  1. <strong>function AAA(){}
  2. let BBB =function (){}
  3. let CCC =()=>{}
  4. console.log(AAA.name);
  5. console.log(BBB.name);
  6. console.log(CCC.name);
  7. console.log((()=>{}).name);</strong>
复制代码
 

 
 
 (最后一行有东西的,空字符)
 
 
3.参数

ECMAScript 函数的参数跟大多数其他语言不同。
ECMAScript 函数既不关心传入的参数个数,也不 关心这些参数的数据类型。
定义函数时要接收两个参数,并不意味着调用时就传两个参数。
你可以传一 个、三个,甚至一个也不传,解释器都不会报错。(好家伙)
 
4.没有重载

js没有重载
(这可真是太有意思了,方法名是指针,参数不管数量,我想js自然是不会有重载的)
方法后定义覆盖先定义(记住了,要考的)
  1. <strong>function add(num) {
  2. return num + 100;
  3. }
  4. function add(num) {
  5. return num + 200;
  6. }
  7. let result = add(100); // 300 </strong>
复制代码
显然,定义两个同名参数,后定义的会覆盖先定义的
 
5.arguments属性

arguments 是一个类数组对象,包含调用函数时传入的所有参数。
 
  1. <strong>function test(a,b,c,d,e){
  2.     console.log(arguments)
  3. }
  4. test(1,2,3,4);</strong>
复制代码
 
 
 

 
 
 
 
5.1.arguments.callee

arguments 对象其实还有一个 callee 属性,是一个指向 arguments 对象所在函数的 指针。
想不出什么好的例子,就用书中的原例吧:
(书中原例)
一个阶乘递归
[code]<strong>function factorial(num) {  if (num

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具