js學習——函數
阿新 • • 發佈:2017-06-28
訪問 fine 賦值 函數提升 調用函數 i++ 第一個 log 執行
函數聲明
function funName(parameter){}
函數表達式,並把函數存儲在變量x中
//不用給函數名,後續並不能直接用給定的函數名調用 var x = function(a){return a}; x;//返回的是一個函數對象 x();//調用函數
用函數構造函數定義一個函數(參數, 表達式)
var myFunc = new Function("a", "b", "return a + b");
函數提升:聲明會自動提前,賦值的不提升
myFunc(10); function myFunc(x){return x;}
函數自動調用自己執行
(function callSelf(){alert("i call myself");})();
函數是對象
function myFunc(){};typeof myFunc;//類型為 function
顯式參數:形參(C++) 隱式參數:實參(C++)
參數規則:對隱式參數不進行類型檢測,也不進行個數檢測
默認參數:如果沒有給隱式參數,那麽顯式參數的值為undefined
function myFunc(x) { x = x||0;//若x是undefined,則將其值設為0 }
arguments對象:function的內置屬性
function myFunc() { var n = arguments.length;//參數的個數 //遍歷輸出每一個參數for(var i = 0; i < n; i++) { alert(arguments[i]); } }
參數傳遞:按值傳遞(C++)
//不是對象的是按值傳遞 var a = 0; function ma(a){a = 4;} ma(a);//結果沒有變化 //隱式參數是按值傳遞 var c = [1,2,3]; function mc(){arguments[0] = 3;} mc(c);//c的值沒有變化
參數傳遞:按引用傳遞(C++)
var b = [1,2,3]; //顯示參數,且參數是一個對象 function mb(b){b[0]=3;}; mb(b);//b的值發生變化
函數調用,有4種調用方式,區別在於this的初始化
this指向調用函數的對象
//作為一個函數調用 function myFunc() { return this; } //返回window對象,因為默認屬於window全局對象 myFunc();
//作為對象的方法調用 var myObj={ myFunc:function(){return this;} }; myObj.myFunc();//返回myObj對象:Object {myFun: function}
//用構造函數調用函數,構造函數中的this沒有任何值 function myFunction(){return this;} //this指向實例化後的對象:myFunction{} var myFunc = new myFunction();
//作為函數方法調用函數 function myFunction(a,b,c){return this;} //第一個參數myObj會成為this var a = 0, b = 0, c = 0; myObj = myFunction.call(myObj, a, b, c);//按參數一個個對應給出 var arr = [0, 0, 0]; myObj = myFunction.apply(myObj, arr);//參數組合成一個數組
js閉包(python中也類似)
可訪問上一層函數作用域裏變量的函數
var add = (function() { var counter = 0; return function() { return counter += 1; }; })();//自調用函數 add(); add();//計數器會遞增
var x = function(){return function(){alert("abc");};}; x; //function(){return function(){alert("abc");};}; x(); //function (){alert("abc");} x()();//會執行alert("abc")
js學習——函數