JS函数
函数是JS中另一种符合类型,可以包含一段可执行的代码。也可以接收调用者传入参数。
作为弱类型语言,函数参数列表不需要声明数据类型,函数的返回值也不需要声明数据类型。
JS中定义一个函数时,同时产生了5个内容。
1:函数。
2:对象。Function类型的对象。也属于Object。
3:方法。每一个函数都依附于一个对象,成为其方法。默认为window对象。
4:变量。函数同名的变量。
5:类。函数同名的类。也是其构造器。
函数同时作为一个类,可以采用如下方式进行调用:
直接调用:返回函数体内return语句的返回值。
new关键字调用:把函数当作类使用,返回一个对象。
函数属性:
函数体内,var声明的变量为局部变量。只能在函数体内访问。使用this前缀修饰的变量,为实例属性。只能使用对象调用。函数名修饰的变量为类属性,使用类名调用。所以当一个属性需要被外部使用时,不要定义为局部变量。
其实定义一个全局变量时,这个变量会依附与window对象,成为其实例属性。
函数调用:
直接调用:如alert(’xxx’)。
call()方法:
var each = function (array,fn){
for(var index in array){
fn.call(null,index,array[index]);
}
}
each([4,5,6],function(index,ele){
document.write("第"+index+"个元素是:"+ele+"<br/>");
});
可以看出,call()方法的使用:函数.call(调用者,参数1,参数2….)= 调用者.函数(参数1,参数2…)
apply()方法:
同call类似。函数.apply(调用者,[参数1,参数2…])
函数的独立性:
函数虽然从属于一个对象,但是都是可以单独使用的。
function person(name){
this.name = name;
this.info = function(){
alert("我是"+name);
}
}
var p = new person('王');
p.info();
var name = '李';
p.info.call(window);
从上可见,person的内部函数,可以被window以及其他的对象所调用。
函数提升:
JS中对于变量和函数,允许先使用后定义。但是,匿名函数只会提升函数对应的变量名,并不会提升函数体。可以简单认为匿名函数不具备函数提升。
箭头函数:相当于lambda表达式,是函数的简化写法。
(param1,param2…) => {statement} 相当于 function(param1,param2…){statement}
JS闭包:
一般情况下,一个函数执行完毕,内部的变量就被销毁了。但是:
function out(){
var a = 'abc';
this.inner = function(){
return a;
}
}
var x= new out();
var b = x.inner();
alert(b);
此时,out()外部函数及时执行完毕,只要还有inner()函数的引用,那么a变量依然存在。这相当于扩大了a变量的作用域,就是所谓的闭包。
参数处理:
JS同java一样,采用值传递方式传参。基本数据类型不会改变其值。符合数据类型,传参时传递过去一个副本,两者指向同一个内容。通过副本修改内容的话,会改变原变量引用的值。但是,修改副本自身,和原变量毫不相关。
参数:
JS允许使用空参数,相当于undifined类型的参数。
JS不强制参数个数,不强制参数类型。所以也没有所谓的重载。直接是后定义个同名函数覆盖前者。
还没有评论,来说两句吧...