1.构造函数
任何函数,只要通过new操作符来调用,那它就可以作为构造函数;而任何函数,入股不通过new操作符来调用,那它跟普通的函数一样。
function Person(name){
this.name = name;
this.sayName = function(){
alert(this.name);
}
}
//当作构造函数
var person = new Person("zhangsan");
person.sayName(); //zhangsan
//当作普通函数
Person("zhangsan"); //在全局作用域中调用一个函数时,this对象总是指向Global对象(在浏览器中就是window对象)
window.sayName(); //zhangsan
2.函数的内部属性:arguments和this
arguments:数组类型,包含传入函数中的所有参数。arguments含一个特殊属性callee,该属性是一个指针,指向拥有这个arguments对象的函数,如下面例子:
function factorial(num){
if(num<=1){
return 1;
}else{
return num* factorial(num-1);
}
}
//使用arguments的callee属性
function factorial(num){
if(num<=1){
return 1;
}else{
return num* arguments.callee(num-1); //arguments.callee 等效于拥有arguments的函数factorial
}
}
this:指向函数执行时所处的作用域,参考如下例子:
window.color = "red";
var o = {color:"blue"};
function sayColor(){ //在全局作用域中定义
alert(this.color);
}
sayColor(); //red,因为在全局作用域中使用sayColor(),所以this指向全局对象window
//以下方法还可以参考使用apply()和call()来限定函数执行的作用域
o.sayColor = sayColor; //把全局函数sayColor赋值给对象o
o.sayColor(); //blue,因为在o对象中使用sayColor,所以this指向o
3.每个函数都包含的两个非继承方法:apply()和call()
先看看这两个方法是使用例子:
用途一:传递参数
function sum(a,b){
return a+b;
}
//apply使用
function callSum1(num1,num2){
return sum.apply(this,arguments); //arguments包含传入函数的参数
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
//call使用,apply传入的参数是一个数组,而call则是一个个具体参数
function callSum3(num1,num2){
return sum.call(this,num1,num2);
}
用途二:扩充函数运行的作用域
call用例(apply类似)
window.color = "red";
var o = {color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue,因为作用域在o上