ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。
1 怎么判断传递进来的参数个数呢?
可以用arguments.length获得:
function doAdd(){ if(arguments.length == 1){ alert(arguments[0] + 10); }else if(arguments.length == 2){ alert(arguments[0] + arguments[1]); } } doAdd(10); doAdd(10,20);
2 分析如下程序的值
function doAdd(num1, num2){ arguments[1] = 10; alert(arguments[0] + num2); } doAdd(20, 50);
注:arguments对应的值永远与对应的命名参数(形参)的值保持同步,但它们的内存空间(num2和arguments[1])是独立的。
结果为30。
3 创建方式
常见的创建方式有两种:
第一种:
function sum(num1, num2){ return num1 + num2; }
第二种:
var sum = function (num1, num2){ return num1 + num2; }
函数是对象,每个函数都是 Function 类型的实例,与其他引用类型一样具有属性和方法。
4 作为值调用
在函数内部,有三个特殊的对象: arguments, this, caller。
写一个阶乘函数,并打印出5的阶乘结果。
function factorial(num){ if(num <= 1){ return 1; }else { return num * arguments.callee(num - 1); } } console.log(factorial(5));
5 什么是this?
this : It is a reference to the context object that the function is operating on
var color = "red"; var obj = {color: "blue"}; function sayColor() { document.write(this.color + "</br>"); } sayColor();
比如,上述程序中,函数sayClolor是在全局环境中运行,那么sayClolor中的this指的是window对象。
6 apply()和call()方法
实际上等于设置函数体内 this 对象的值。
var color = "red"; var obj = {color: "blue"}; function sayColor() { var color = "green"; document.write(this.color + "</br>"); } sayColor(); sayColor.call(obj);
答案是:
red
blue
当运行sayColor.call(obj)时,sayColor的执行环境已经是在对象obj中,这时sayColor函数中的this指向了对象obj,所以,根据作用域链,自然打印的是obj中的color:blue.
apply()和call()作用一样,仅仅是参数有所不同。
注意:使用 call() 或 apply() 来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。
举个例子:有七个对象person,需要打印出各自的姓名。
var name = "father"; var child1 = {name: "A", age:10}; var child2 = {name: "B", age:12}; function sayName() { document.write(this.name+"<br>"); } sayName(); sayName.call(child1); sayName.call(child2);