关于js函数的说明

js函数直接声明和函数表达式的区别:

直接声明函数:

function test(){  }

把匿名函数复制给本地变量:

var test = function(){  }

区别:第一种方式在声明时就是一个命名的函数,无论是声明在调用之前还是在调用之后,甚至是不会执行的位置,比如return语句之后,都是整个作用于可以访问的。第二种方式是通过把匿名函数复制给变量的方式,这是一个函数表达式,在复制之前这个函数不能被任何代码访问到,即这个复制必须在调用之前完成,否则调用时会出现错误。

 

在js运行中有一个特殊的全局环境,这个对象上面存放全局的函数和变量,实际开发中经常会使用若干第三方的库或多个js文件,若不小心在全局对象引入重复的变量或函数声明,则会造成代码执行混乱。先后引入两个js文件定义了同一个函数,则后面引入的函数会覆盖第一个定义的函数,造成错误。为了避免这种错误,使用匿名函数的方法已经被大多数开源js库使用。

(function(){

function log(msg){console.og(msg);}

})();

在这里,log函数的作用于被限制在这个匿名函数之内,而匿名函数则因为被外面的一对小括号包括起来,形成一个函数表达式,表达式的值是一个函数,紧接着一对小括号表示立即执行这个函数,让原有的代码正常执行一次。这种方式声明的函数,通过var声明的变量等等都是内部的,不会被任何匿名函数之外的代码访问到。如果需要对外暴露一些函数作为接口的话,使用以下方法:

var mylib = (function(global){

  function log(msg){

    console.log(msg);

}

log1=log;//法一:利用没有var的变量声明的默认行为,在log1成为全局变量,不推荐的方法。

global.log2=log;//法二:直接在管局对象上添加log2属性,复制为log函数,推荐方法。

return{

  log:log  //法三:通过匿名函数返回值得到一些列借口函数集合对象,复制给全局变量mylib,推荐。

};

}(window));

 

函数作为参数或返回值使用时,成为高阶函数。js中的函数都可以作为高阶函数来使用。

function negative(n){

return -n;

}

function square(n){

return n*n;

}

function process(nums,callback){

var result=[];

for(var i=0,length=nums.length;i<length;i++){

    result[i]=callback(nums[i]);

  }

return result;

}

 

var nums=[1,2,3,4,5,6];

var n=process(nums,negetive);  //n=[-1,-2,-3,-4,-5,-6]

var m=process(nums,square);   //m=[1,4,9,16,25,36]

 

以上代码将函数作为参数出传入另一个函数process调用,在process函数的实现中,把callback作为一个黑盒子看待,负责把参数传给它,然后获取返回值,在调用之前并不清楚callback的具体实现。

 

posted @ 2017-01-19 17:57  catherinehd  阅读(195)  评论(0编辑  收藏  举报