js学习——函数
函数声明
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")