您当前的位置: 首页 > 学无止境 > JS经典实例 网站首页JS经典实例
javascript学习笔记-Function类型
发布时间:2018-04-05 17:48:42编辑:雪饮阅读()
在 ECMAScript 中,Function(函数)类型实际上是对象。每个函数都是 Function 类型的 实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也 是一个指向函数对象的指针。
使用变量初始化函数
var box=function(num1,num2){
return num1+num2;
}
alert(box(1,2));
使用new关键字来声明函数
既然函数实际上是对象,那么对象是可以通过new来实例化的
var box=new Function('num1','num2','num3','return num1+num2+num3');
alert(box(1,2,3));
这种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规 ECMAScript 代码,第二次是解析传入构造函数中的字符串),从而影响性能。但我们可以通 过这种语法来理解"函数是对象,函数名是指针"的概念。
作为值的函数(将函数本身作为参数)
function box(sum,num){
return sum(num);
}
function sum(num){
return num+10;
}
arguments.callee
在函数内部,有两个特殊的对象:arguments 和 this。arguments 是一个类数组对象,包
含着传入函数中的所有参数, 主要用途是保存函数参数。 但这个对象还有一个名叫 callee 的
属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
对于阶乘函数一般要用到递归算法, 所以函数内部一定会调用自身; 如果函数名不改变
是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题, 我
们可以使用 arguments.callee 来代替。
var result=box(sum,10);
function sum(num){
if(num<=1){
return 1;
}
else{
return num*arguments.callee(num-1);
}
}
alert(sum(4));
this
函数内部另一个特殊对象是 this,其行为与 Java 和 C#中的 this 大致相似。换句话说,
this 引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域(这里所说的作用域是指某个对象中或者全局中)。PS:当在
全局作用域中调用函数时,this 对象引用的就是 window。
实例1
var col='hs';
alert(this.col);
var box={
col:'ls',
sayCol:function(){
//由于this此时在box对象中,所以此时alert为ls
alert(this.col);
}
};
box.sayCol();
实例2
window.col='hs';
function saycol(){
alert(this.col);
}
saycol();
var box={
col:'ls',
};
//由于这里相当于将saycol的方法体建立为box的saycol方法,而由于在box内部了,所以this代表了box,所以此时alert为ls
box.saycol=saycol;
box.saycol();
函数的属性length
函数的属性length可以返回该函数希望被传入的参数的个数
function saycol(num1,num2){
return num1+num2;
}
alert(saycol.length);
函数的属性apply
apply属性用来冒充一个函数的执行
function box(num1,num2){
return num1+num2;
}
function sum(num1,num2){
//apply的第一个参数用来指示待冒充函数的作用域在什么对象下,第二个参数待冒充函数的参数数组
return box.apply(this,[num1,num2]);
}
function sum2(num1,num2){
//可以用arguments来直接替换参数数组,这样防止参数过多时候需要一个个的传参
return box.apply(this,arguments);
}
alert(sum(1,2));
alert(sum2(3,2));
函数的属性call
call属性用来冒充一个函数的执行
function box(num1,num2){
return num1+num2;
}
function sum(num1,num2){
//call函数和apply函数一样,只是在传递第二个参数的时候不是以一个数组整体传参,而是和普通函数的传参方式一样
return box.call(this,num1,num2);
}
alert(sum(1,2));
为什么要冒充?
冒充不仅仅可以冒充函数还可以冒充对象,冒充可以改变一个函数中this的所指环境对象
var color='红色';
var box={
color:'蓝色',
};
function sayColor(){
alert(this.color);
}
//不使用对象冒充输出全局的红色
sayColor();
//冒充全局对象,输出全局的红色
sayColor.call(window);
sayColor.call(this);
//冒充box对象,输出box的蓝色
sayColor.call(box);
关键字词:javascript,function