javascript的函数主要可以用于以下几个方面:
- 赋值给一个变量;
- 赋值给对象一个属性;
- 作为参数传入别的函数;
- 作为别的函数的返回值;
- 用字面量创建(此处还未明白,是用var a={ a:function(){} }这样的方式进行创建吗)
javascript函数的参数,即使在定义函数没有加任何的形参,也可以将任意多的参数传入函数进行处理。其原理是javascript在处理函数与其他的编程语言不一样,解释器传递给函数的是一个类似于数组的内部值,叫arguments,在函数对象生成时被初始化。
function sum(){ var result = 0; for(var i = 0, len = arguments.length; i < len; i++){ var current = arguments[i]; if(isNaN(current)){ throw new Error("not a number exception"); }else{ result += current; } } return result; }
javascript的作用域为函数作用域,无块作用域,
function func(){ for(var i=0;i<arguments.length;i++){ print(arguments[i]); } print(i); } func('a','b','c');
javascript的函数在局部作用域内运行,可以访问其外部作用域内的变量和函数(可能是全局的作用域的变量和函数)。javascript的作用域为词法作用域,就是在函数定义就确定下来而不是在执行才确定。如下函数在执行函数时,第一次打印str,访问在函数作用域内未定义的变量str会打印undefined。
var str="global"; function func(){ print(str); var str="private"; print(str); } func();//打印为undefined和private
对以上的代码片段进行详细的说明:第一行定义的str,将global赋值给它,在定义时会被放在作用域链的头部即全局作用域中;在调用func的时候,javascript解释器会生成一个call object(调用对象),并将func中通过var定义的变量设为它的属性,然后将call object放到作用域的最前端,即拥有最优先的访问权。在访问str时,会首先查询func的访问对象,查询其中是否有该变量的定义,如果没有找到则会查找call object的上一层作用域,直到查找全局作用域。在上面的代码片段中,在func的call object中查找str,找到str覆盖全局作用域的str,但在调用str时,在该函数体中还未定义赋值 ,所以会打印undefined.
javascript中的函数上下文: 在java/C中方法是依附于对象存在的,而在javascript中函数也是对象,是对立存在的,可以作为一个对象的属性,方法,也可以作为另一个对象的函数方法。因些函数的上下文也是变化的,与此同时函数体内的this也是变化的。函数通过调用call方法和apply方法来改变函数的上下文。
call 方法和apply 方法的使用如以下代码片段所示:
var jack={ name:'jack', age:20 }; var rose={ name: 'rose', age:19 }; function printName(){ return this.name; }; print(printName.call(jack));//上下文为jack print(printName.call(rose));//上下文为rose print(printName.apply(jack)); print(printName.apply(rose));
在传入一个参数时,call方法和apply方法是相同的。传入多个参数时call方法和apply方法有所不同,差异主要如以下代码片段所示:
function setName(name){this.name=name}; setName.apply(jack,["jack Recpt"]); print(printName.call(jack));
打印为jack Recpt
apply的第二个参数为函数需要参数组的一个数组;
setName.call(rose,"rose jizz ");print(printName.call(rose));
打印为rose jizz
call需要若干个参数,参数以逗号分割开。