示例代碼:數組
function fun() { console.log('一笑一人生'); }
示例代碼:緩存
var fn = function () { console.log('一花一世界'); }; // 判斷函數是否爲Function類型的 console.log(fun instanceof Function);//調用結果爲 true console.log(fn instanceof Function);//調用結果爲 true //JavaScript中全部的函數都是Function類型的對象
語法:
var 函數名 = new Function(參數,函數體);閉包
示例代碼:app
var f = new Function('a','console.log(a)'); f(100);//以函數方式進行調用
示例代碼:函數
//1. Object與Function都是自身的類型 console.log(Object instanceof Object);//調用結果爲 true console.log(Function instanceof Function);//調用結果爲 true //2. Object自身是構造函數,而構造函數也是函數,是函數都是Function類型 console.log(Object instanceof Function);//調用結果爲 true //3. Function是引用類型,用於建立對象,是對象都是Object類型 console.log(Function instanceof Object);//調用結果爲 true
示例代碼:佈局
// 變量的聲明提早 console.log(v);//調用結果爲 undefined var v = 100; // 若是使用函數聲明方式定義函數時 - 函數的聲明提早 fun();//調用結果爲 一花一世界 function fun() { console.log('一花一世界'); }
代碼的執行流程分析圖:
this
apply(thisArg,argArray)方法 - 用於調用一個指定的函數spa
參數code
示例代碼:對象
// 定義函數 function fun(value) { console.log('一花一世界' + value); } //函數的調用方式 // 語法結構 : 函數名稱() fun('一笑一人生');//調用結果爲 一花一世界一笑一人生 fun.apply(null,['一葉一孤城']);//調用結果爲 一花一世界一葉一孤城
Function的call()方法用於調用一個函數,並接收指定的this值做爲參數,以及參數列表
示例代碼:
//定義函數 function fun(value,value2) { console.log('一花一世界' + value + value2); } // 函數的調用方式 //語法結構 : 函數名稱() fun('一笑一人生','極樂世界');//調用結果爲 一花一世界一笑一人生極樂世界 fun.apply(null,['一笑一人生','走你']);//調用結果爲 一花一世界一笑一人生走你 // call()方法 - 用於調用一個函數 fun.call(null,'一笑一人生','一葉一菩提');//調用結果爲 一花一世界一笑一人生一葉一菩提
bind(thisArg,arg1,arg2,...)方法
參數
示例代碼:
//定義函數 function fun(value) { console.log('一花一世界' + value); } /* var f = fun.bind();// 相對於從指定函數複製一份出來 console.log(f); f();*/ fun('一笑一人生');// 調用結果爲 一花一世界一笑一人生 var f = fun.bind(null,'一葉一菩提'); f();// 調用結果爲 一花一世界一葉一菩提
重載的含義:
示例代碼:
function add(a,b){ return a + b; } function add(a,b,c){ return a + b + c; } function add(a,b,c,d){ return a + b + c + d; } //理想效果: add(1,2);// 3 add(1,2,3);// 6 add(1,2,3,4);// 10 //實際效果: // JavaScript的函數不存在重載 -> 當函數同名時,最後一次定義的函數有效 console.log(add(1,2));// NaN console.log(add(1,2,3));// NaN console.log(add(1,2,3,4));// 10
JavaScript提供arguments對象
屬性
示例代碼:
function add() { var num = arguments.length; switch (num) { case 2: return arguments[0] + arguments[1]; break; case 3: return arguments[0] + arguments[1] + arguments[2]; break; case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3]; } } console.log(add(1,2));//調用結果爲 3 console.log(add(1,2,3));//調用結果爲 6 console.log(add(1,2,3,4));//調用結果爲 10
示例代碼:
function fun() { // 當前函數的邏輯內容 console.log('this is function'); // 調用自身函數 - 實現遞歸 fun(); } fun();
控制檯效果解析圖:
示例代碼:
function fn(v) { console.log(v); /* 語句判斷 */ if (v >= 10) { /* 結束語句循環 */ return; } //fn(v + 1); arguments.callee(v + 1); } //fn(0); var f = fn; fn = null; f(0); console.log(f);
控制檯調用圖:
匿名函數的做用:
示例代碼:
// 做爲另外一個函數(fn)的參數的函數(one) - 回調函數 var one = function(){ return 1; } function fn(v){ return v(); } // one函數僅是做爲fn函數的參數出現 - 並非調用 // var result = fn(one); /* 以上代碼等價於如下代碼 如下代碼中做爲參數的函數 - 匿名回調函數 */ var result = fn(function(){return 1;}); console.log(result);// 1
回調函數分析圖:
示例代碼:
// 做爲另外一個函數(fn)的參數的函數(one) -> 回調函數 var one = function(w){ return w; } function fn(v){// 形參是一個函數 return v(100);// 函數的調用體 } // var result = fn(one);// 實參必須是一個函數 var result = fn(function(w){return w;}); console.log(result);
回調函數的參數的分析圖:
自調函數 - 定義即調用的函數
示例代碼:
// 全局做用域 - 生命週期:JavaScript文件從執行到執行完畢 (function(value){ // 函數做用域 - 生命週期:從函數調用到調用完畢 console.log('一花一世界' + value); })('一葉一菩提'); // 表達式語法 (function(value){ // 函數做用域 - 生命週期:從函數調用到調用完畢 console.log('一花一世界' + value); }('一笑一人生'));
示例代碼:
var one = function(){ return 100; }; // 做爲值的函數 -> 內部函數的一種特殊用法 function fun(){ var v = 100; // 內部函數 return function(){ return v; }; } var result = fun(); console.log(fun()());// 調用結果爲 100
示例代碼:
var a = 10;// 全局變量 function fun(){ var b = 100;// fun函數做用域的局部變量 // 內部函數 function fn(){ var c = 200;// fn函數做用域的局部變量 // 內部函數 function f(){ var d = 300;// f函數做用域的佈局變量 // 調用變量 console.log(a);// 10 console.log(b);// 100 console.log(c);// 200 console.log(d);// 300 } f(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// 200 // console.log(d);// d is not defined } fn(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// c is not defined // console.log(d);// d is not defined } fun();
做用域鏈的分析圖:
閉包是什麼:
示例代碼:
var n;// 定義變量,但不初始化值 function fun() {// 函數做用域 var v = 100; // 進行初始化值 - 一個函數 n = function () { console.log(v); }; // n(); } fun(); n();// 調用結果爲 100
閉包的特色:
閉包的做用: