标签:
在js中函数实际上是对象,函数名就是指向函数对象的指针,使用函数名访问的是函数的指针,函数名后面加括号则是调用函数,使其执行。
把一个函数名当做参数传递给另一个函数是,此时参数只是一个指向函数对象的指针。
函数没有重载,这个结论可以由以上结论得出。
function add(num){
return num+100;
}
function add(num){
return num+200;
}
var result=add(100);
console.log(result);
结果:300
解释:后面的add覆盖了前面的函数。
**********************************************************************************************************************
函数内部有两个特殊的属性:arguments和this
arguments:是以个类数组对象,保存了传递给函数的所有参数。它有一个属性叫callee,callee是一个指针,指向拥有arguments这个类对象的构造函数。
function test(num){
if(num<=1){
return 1;
}else{
return num * test(num-1); //这里可以改写为 return num * arguments.callee(num-1);这样,无论以后函数名改成什么都可是实现递归的作用。
}
}
this:引用的是函数具体执行的环境对象
window.color="red";
var o={color:"blue"};
function show(){
console.log(this.color);
}
show(); 1 //打印结果为:red
o.show=show; //在这里很好的说明函数名其实就是一个指向函数的指针
o.show(); 2 //打印结果为:blue
分析:在1处,this引用的是全局对象window,在2处this引用的是o这个对象。
************************************************************************************************************************
关于call()和apply()方法的理解:
call()和apply()具有相同的作用,他们的作用就是扩充作用域,对象不需要和方法有任何耦合关系。
call()和apply()的区别就是接收参数的不同,call()接收的参数必须逐个列举出来。
如果传入的参数是一个arguments对象或者数组,那么建议采用apply方式会比较方便。
function sum(a,b){
return a+b;
}
function callsum(a,b){
return sum.call(this,a,b); //第一个参数this不需要改变外,其他参数都要直接传递给函数
}
console.log(callsum(10,10)); //结果为:20
*************************************************************************************************************************
bind()方法理解:
bind方法会创建一个函数的实例,并且把this传递给传入的对象
window.color="red";
var o={color:"blue"};
function show(){
console.log(this.color);
}
var oo=show.bind(o);
console.log(00); //打印结果为blue
***********************************************************************************************************************
今天学了这些,有遗漏,估计也有错误。今后还得继续努力加油。
标签:
原文地址:http://www.cnblogs.com/yujiaqinzheng/p/4973036.html