1. 程式人生 > >js學習——函數

js學習——函數

訪問 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學習——函數