函数源于数学映射运算,它定义了一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素
javascript中:
函数是代码块,一段被封闭严实的代码块
函数是数据:用户可以把函数作为 值 赋值给 变量
函数是一种对象,它是一类抽象类(构造函数),所有对象都是通过类型构造而来var a=new Array() var f=new Function();
一 :定义函数的3中方法:(函数若没有return则默认返回undefined)
----function语句:具有函数作用域(以命令的形式 静态 构造一个函数)
function() f(x){return x}
----Function构造函数:(顶级函数)具有顶级作用域(解析函数体,动态 创建一个函数对象)
var f=new Function("x","return x")
---函数直接量:具有函数作用域(以表达式的形式 静态 创建一个函数)
var f=function(x){return x}
举例:以下等价
var f=new Function("a,b,c","return a+b+c")
var f=new Function("a","b","c","return a+b+c")
var f=new Function("a,b","c","return a+b+c")
function f(a,b,c){ return a+b+c}
var f=function(a,b,c){return a+b+c}
2理解 顶级作用域和局部作用域
var n=1;
function f(){
var n=2;
function e(){
return n;
}
return e;
}
alert(f()());//2
---------------------------------------------------------------
var n=1;
function f(){
var n=2;
var e=function(){
return n;
}
return e;
}
alert(f()());//2 普通函数作用域
-----------------------------------------------------------
var n=1;
function f(){
var n=2;
var e= new Function("return n;")
return e;
}
alert(f()());//1 顶级函数作用域
二. 预定义函数
javascript提供的可供随时调用的内建函数
parseInt() parseFloat() isNaN() isFinite()
encodeURI(url) decodeURI()
encodeURIComponent(url) decodeURIComponent()
eval()
alert()--这个是宿主环境-浏览器提供
三:回调函数
当我们将函数A传递给函数B,并由B来执行A时,A就成了一个 回调函数 (callback functions),若果这时A还是一个匿名函数,则称为匿名回调函数
function multiplayByTwo(a,b,c){
var i,ar=[];
for(i=0;i<3;i++){
ar[i]=argment[i]*2;
}
return ar;
}
funtion addOne(a){return a+1;}
multiplayByTwo(1,2,3);//[2,4,6]
addOne(100);//[101]
var myarr=[];
myarr=mulplayByTwo(10,20,30);//[20,40,60]
for(var i=0;i<3;i++){
myarr[i]=addOne(myarr[i])
}
myarr //[21,41,61]
修改成回调函数:
funtion addOne(a){return a+1;}
function multplayByTwo(a,b,c,callback){//使用回调函数callback
var i,ar=[];
for(i=0;i<3;i++){
ar[i]=callback(arguments[i]*2);
}
return ar;
}
myarr=multplayByTwo(1,2,3,addone)
multplayByTwo(1,2,3,function(){//简化,使用匿名函数 直接代替addone()
return a+1;
})
四、即时函数
(function(name){alert('hello'+name)})('Owen')// hello Owen
var result=(function(){... ;return someting}())
var result=function(){... ;return someting}()//可读性比上一句差了点,不读到最后不知道result到底是一个函数还是一个即时函数的返回值
五、内部(私有)函数
function outer(param){
function inner(theinput){
return theinput*2;
}
return 'the result is'+inner(param);
}
var outer=function(param){
var inner=function(theinput){
return theinput*2;
}
return 'the result is'+inner(param);
}
outer(2)//'the result is 4'
inner(2)//报错, 这是个私有函数,外部不能调用
六、返回函数的函数
function a(){
alert('A!');
return function(){
alert('B!');
}
}
var newF=a();//A!
newF();//B!
七、能重写自己的函数
function a(){
alert('A!');
a=function(){
alert('B!');
}
}
八、闭包(getter ,setter ,迭代器(next()))
利用闭包实现迭代器
function setup( ){
var i=0;
return function(){
return x[i++]
}
}
var next=setup(['a','b','c','d']);
next();//a
next();//b
next();//c
利用闭包getter setter
var getValue,setValue;
(funciton(){
var secret=0;
getValue=function(){
return secret;
}
setValue=funciton(v){
if(typeof v==='number'){
secret = v;
}
}
})()