函式解构:
functionName:为函式命名,当函式型态为函式陈述式,则必须命名。
函式里面宣告的变数:为区域变数,仅对函式内部有效。
参数:函式可依照输入的参数不同,产生不同的结果。
有关函式表达式及函式陈述式可参考此篇
function functionName(parameter) { var localVariable = '区域变数'; console.log(this, localVariable); // This、区域变数 return '附加一段' + parameter; // 回传、参数 } var data = functionName('参数');// 呼叫函式 console.log(data);
var functionC = function functionName() { console.log(functionC); console.log(functionName); } functionC(); console.log(functionC); console.log(functionName);
解functionC():
执行console.log(functionC)的结果:如下 console.log(functionC); console.log(functionName);}
执行console.log(functionName)的结果:如下 console.log(functionC); console.log(functionName);
解console.log(functionC):
console.log(functionC); console.log(functionName);
解console.log(functionName):
出现错误讯息:functionName is not defined,因为函式表达式的函式名称只供该表达式调用,无法给其他函式使用。
函式名称调用例子:
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));
结果:
立即函式:IIFE (Immediately Invoked Function Expression)
特点
可以立刻被执行,是函式表达式。型态:(function"functuin名字"(....)())或是(function"functuin名字"(....))()皆可,后面的()可以填入参数。具名函式如果为立即函式型态,则无法再次执行。匿名函式也会立刻执行。 function functionName() { console.log("呼叫成功"); }; functionName(); //呼叫成功 (function functionName2() { console.log("呼叫成功2"); }()); //呼叫成功2 functionName2(); //出现错误讯息:functionName2 is not defined (function () { console.log("匿名函式呼叫成功"); }()); //匿名函式呼叫成功 *填入参数* (function (参数输出) { console.log(参数输出); })('我要呼叫'); //我要呼叫 (function (output) { console.log(output); return output; })('input'); //input (function (output) { console.log('123'); return output; })('input'); //123 var result = (function (output) { console.log('123'); return output; })('input'); //123 console.log(result);//input
立即函式间取值:
var a = {}; 把变数a的值(物件的address)当成参数带入立即函式内 (function (参数b) { 参数b.person = 'TOM'; })(a); console.log(a); //{person: 'TOM'} (function (参数c) { console.log(参数c.person); //TOM,因为取相同的值(物件的address)当成参数。 })(a);
延伸:
(function (参数b) { 参数b.person = 'TOM'; })(window); (function (参数c) { console.log(person); //TOM })();
延伸解:
把window(浏览器)作为物件(属全域物件),并把address当作参数,并挂上属性person且值为'Tom'。第二个立即函式无须填入参数,因为window本身的address就是参数。观念釐清: return 跟 console.log。
function add(a, b) { console.log(a + b) } add(1, 2)
上方会出现3的结果,是因为function add执行了里面的console.log。
function add(a, b) { return a + b } add(1, 2); //无结果。 console.log(add(1, 2)); //3 var x = add; console.log(x); //ƒ add(a, b) {return a + b} console.log(x(1, 2)); //3
参考:
[JS] 函式参数、算数、回传、函式间互相传递:https://medium.com/%E9%A6%AC%E6%A0%BC%E8%95%BE%E7%89%B9%E7%9A%84%E5%86%92%E9%9A%AA%E8%80%85%E6%97%A5%E8%AA%8C/js-%E5%A6%82%E4%BD%95%E9%81%8B%E7%94%A8%E5%87%BD%E5%BC%8F%E9%80%B2%E8%A1%8C%E9%81%8B%E7%AE%97-a2c2a560a86c