※剩餘參數
window.onload = () => {
restParam('a','b','c');
}
function restParam(...str) {
for(let s of str) alert(s);
}
※限制參數
限制最多幾個參數window.onload = () => {
RestrictionParam(); // undefined-undefined
RestrictionParam('a','b'); // a-b
RestrictionParam('a','b','c'); // a-b
}
function RestrictionParam(...[p1, p2]) {
alert(p1 + '-' + p2);
if(typeof(arguments[2]) != 'undefined'){
alert(arguments[2]);
}
}
※實際上沒有真的限制,只是傳進來不用
※...在變數的前面,和java相反
※...只能寫在參數的最後,和 java 一樣
※...傳進來的參數,可以是不同型態
※傳參數但不用
function test(){
for(var i=0; i<arguments.length; i++){
alert(arguments[i]);
}
for(i in arguments){
alert(arguments[i]);
}
}
----------
<button onclick="test('a', 'b')">f1</button>
※使用arguments還是可取得參數
※匿名function
<button onclick="(function(){alert(arguments[0])})('a')">f1</button>
<button onclick="(function(p1){alert(p1)})('a')">f2</button>
※兩種方式都可以
※這種匿名外面有圓括號,就是「(function xxx)()」最外層的圓括號,最後的圓括號是傳進去的值
※巢狀function
※無參數
function outer(){
function inner(){
return 1;
}
/*
var inner = function(){
return 1;
}
*/
return inner;
// return inner();
}
----------
<button onclick="alert(outer())">f1</button>
<button onclick="alert(outer()())">f2</button>
※inner兩種方式我測的結果都一樣
※return有沒有加「()」有差
沒加時,f1按鈕是inner整個function;f2按鈕是1
有加時,f1按鈕是1;f2失效
※有參數
function outer(p1){
function inner(p2){
return p2;
}
return inner(p1);
}
----------
<button onclick="alert(outer(2))">f1</button>
<button onclick="alert(outer(2)())">f2</button>
※有參數時,呼叫outer當然沒問題,但裡面要傳參數到內部的inner參數時,一定要有「()」,所以外面(button)無法呼叫到裡面的inner,也就是說inner function只供outer使用
※內外層互動
function outer(p1, p2){
function inner(p3 ,p4){
return p3 * p4;
}
return inner(p1, p2) + p1 + p2;
}
----------
<button onclick="alert(outer(1, 2))">f1</button>
※當然還是不能直接呼叫內部function,inner function只供outer使用
※內外層變數
var x = "xxx";
function outer(){
var x = "ooo";
/*
var inner = function(){
return x;
}
*/
var inner = new Function("return x;");
return inner;
}
----------
<button onclick="alert(outer())">f1</button>
<button onclick="alert(outer()())">f2</button>
※正常情形是抓最近的變數,但用new Function只會抓全域的,所以將全域的刪除,裡面new Function也不會抓到
※四種寫法
function f1(x){
alert(x);
}
var f2 = new Function('x', 'alert(x);');
var f3 = function(x){
alert(x);
}
var f4 = (x) => {
alert(x);
}
----------
<button onclick="f1('F1')">f1</button>
<button onclick="f2('F2')">f2</button>
<button onclick="f3('F3')">f3</button>
<button onclick="f4('F4')">f4</button>
※f2的最後一個參數一定是內容就對了,換句話說,如果不放參數,那內容就是第一個
※f4是lambda的寫法,我用IE11了,都還是不支援,而且還會導致其他的function出錯,所以IE不要去用它
※f4可以說是從f3改的,放在f1和f2都不行
※還有匿名寫法,例如就把f1拿掉,就是了,要用時就整個搬到呼叫的方法即可
※箭頭函數沒有 this、super、arguments、new.target
※除了 f1 的寫法外,其他三種寫法,函數名稱一樣,會後者蓋前者,f1 只要名稱一樣,就會最先被蓋過去
※箭頭函數省略寫法
<script>
'use strict';
window.onload = _ => {
alert(xxx(9));
ooo(8);
}
let xxx = x => {
return x;
}
let ooo = o =>
alert(o);
</script>
※1.如果沒有參數,除了「() =>」,還可以用「_ =>」
2.如果只有一個參數,可以省略「()」
3.如果只有一行,可以不用「{}」,但如果有回傳值,連「return」關鍵字也不能有
※一般函數和箭頭函數比較
※this
<script>
'use strict';
window.onload = () => {
let o = new Obj('x');
alert(o.p);
}
function Obj(p) {
this.p = p;
return p;
}
/*
let Obj = (p) => {
this.p = p;
return p;
}
*/
</script>
※
※arguments
<script>
'use strict';
window.onload = () => {
xxx(9,8);
}
function xxx() {
alert(arguments.length);
}
/*
let xxx = () => {
alert(arguments.length);
}
*/
</script>
※
※new.target
<script>
'use strict';
window.onload = _ => {
Foo();
new Foo();
// x();
// new x();
}
function Foo() {
alert(new.target);
if(typeof(new.target) == 'undefined'){
alert('non constructor');
} else {
alert('is constructor');
}
}
/*
let x = _ => {
alert(new.target);
}
*/
</script>
※使用 new.target 可以知道是不是用 new 的方式進來的
※new.target.name
<script>
'use strict';
window.onload = _ => {
new Father(); // Father
new Me(); // Me
}
class Father {
constructor() {
alert(new.target.name);
}
}
class Me extends Father {
constructor() {
super();
}
}
</script>
※
※立刻執行的函數
( function() {alert("一");} )();
( function() {alert("二");} ());
new function() {alert("三");} ();
new Function("alert('四');") ();
( () => {alert("五");}) ();
+ function() {alert("1");} ();
- function() {alert("2");} ();
! function() {alert("3");} ();
~ function() {alert("4");} ();
※不需要呼叫,自己就執行了,中間可不用空格,只是方便對照而已
※如果有參數,參數值可以寫在最後面的圓括號裡
沒有留言:
張貼留言