这篇文章要来介绍甚么是函式
首先先让我们看一下下方的程式码
// 函式结构function afunction (parameter) { var localVariable = '区域变数'; // this、区域变数 console.log(this, localVariable); return '附加一段' + parameter; // 回传、参数}var data = afunction('参数');console.log(data);
我们可以看到这是一个 函式陈述式,包含了
~ 函式的名称: afunction
~ 函式的参数: parameter
~ 函式的指称: this
~ 函式内部的变数(区域变数): localVariable
~ 回传值: return
又因为函式可以回传值让这个呼叫的部分变成表达式,表达式的回传值又可以赋予变数内容
所以 var data = afunction('参数');
,这段才能成立
函式就是物件
这个概念之前有讲过,只是他多了 允许被呼叫的能力(XXX()) 以及 能够包含程式码片段的能力({})
上方的程式码执行的结果我们可以看到如下
函式的名称是刻在物件的属性中,并且不能被覆写的。如果撰写函式陈述式的话,就必须要给予函式的名称。但如果是函式表达式的话,则不一定需要名称,这种情况就称作 匿名函式。
函式的参数可以接受在被呼叫的地方传入的资料,做一些处理。
this
这边先有印象就好,之后会再后面的篇章介绍。
区域变数也只能在函式内调用,在函式的 {}
以外的地方无法被调用。
回传值可以回传任何资料型态的资料,传值就传值,传物件就传参考。
名称
之前我们有介绍过函式的陈述式以及表达式,除了写法不同外,在 hoisting 的时候,被写入记忆体的顺序也不同,有兴趣的人可以参考 先前的文章。
那么下面要讲述的重点在于函式跟名称之间的关係
首先我们可以看到下面这段程式码:
function functionA () { console.log('函式陈述式', '具名函式'); console.log(functionA);}functionA();var functionB = function () { console.log('函式表达式', '匿名函式'); console.log(functionB);}functionB();
上述的程式码中,functionA 是利用函式陈述式撰写的具名函式
functionB 则是 利用函式表达式撰写的匿名函式。
呼叫方式则个别是 functionA() 以及 functionB()
但事实上 functionB 并不是后面的 匿名函式的 函式名称 喔!
我们来看看结果
我们可以看到 functionB 印出来之后的 函式名称是空的。所以其实利用这样的 函式表达式 写入到变数的 functionB 其实也是把后面的匿名函式的记忆体参考位置给传入 functionB中。
并且利用 functionB() 的方式进行呼叫。
到这边应该还可以理解吧~!
那么要再提到另一个观念就是
函式表达式后面的函式不一定是要匿名的喔!
直接看範例最快~
var functionC = function functionD () { console.log(functionC, functionD);}functionC();
有看到吗? 我们明明是印出 functionC 以及 functionD。
但其实他们的 函式名称 都是 functionD。
所以也验证了刚刚提到的,functionB 并不是 后面函式的函式名称这个概念。
另一个重点就在于,这个 functionD 的呼叫,只能在 functionD 的 {}
这个 scope 内,在这个 scope 以外的地方,就无法呼叫喔!
var functionC = function functionD () { console.log(functionC, functionD);}functionD();
那么到底,甚么时候会用到函式表达式的函式是具名函式呢?
看看範例!
var num = 1;var giveMeMoney = function giveMoreMoney (coin) { num += 1; console.log('执行giveMeMoney', num, coin); return coin > 100 ? coin : giveMoreMoney(num * coin);}console.log(giveMeMoney(30));
我们可以看到这是一个可以渐渐增加钱的 具名函式。
等 coin 的数量超过 100 之后,才会回传 coin 的数字,并且被印出来。
如果还没的话就会乘上一个不断 +1 的基数在重新跑一次 giveMoreMoney 的函式。
所以可以预期它的结果应该是下面这样
以上这篇文章就是对函式的一个基础的介绍,没有问题的话就可以继续往下一篇文章进行噜~!
希望对大家有帮助~汪汪