[JavaScript]-----函数

来源:互联网 发布:java并发实战 编辑:程序博客网 时间:2024/05/03 19:34

一 

在ECMAScript 中,Function(函数)类型实际上是对象。每个函数都是Function 类型的

实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也

是一个指向函数对象的指针。


二 

一.函数的声明方式
1.普通的函数声明
function box(num1, num2) {
return num1+ num2;
}
2.使用变量初始化函数
var box= function(num1, num2) {
return num1 + num2;
};
3.使用Function 构造函数
var box= new Function('num1', 'num2' ,'return num1 + num2');

PS:第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规
ECMAScript 代码,第二次是解析传入构造函数中的字符串),从而影响性能。但我们可以通


二.作为值的函数
ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不
仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数
的结果返回。
function box(sumFunction, num) {
return sumFunction(num); //someFunction
}
function sum(num) {
return num + 10;
}
var result = box(sum, 10); //传递函数到另一个函数里


三.函数内部属性
在函数内部,有两个特殊的对象:arguments 和this。arguments 是一个类数组对象,包
含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫callee 的
属性,该属性是一个指针,指向拥有这个arguments 对象的函数。
function box(num) {
if (num <= 1) {
return 1;
} else {
return num * box(num-1); //一个简单的的递归
}
}
对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身;如果函数名不改变
是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题,我
们可以使用arguments.callee 来代替。
function box(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);//使用callee 来执行自身
}
}

函数内部另一个特殊对象是this,其行为与Java 和C#中的this 大致相似。换句话说,
this 引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域。PS:当在
全局作用域中调用函数时,this 对象引用的就是window。
//便于理解的改写例子
window.color = '红色的'; //全局的,或者var color = '红色的';也行
alert(this.color); //打印全局的color
var box = {
color : '蓝色的', //局部的color
sayColor : function () {
alert(this.color); //此时的this 只能box 里的color
}
};
box.sayColor(); //打印局部的color
alert(this.color); //还是全局的


//引用教材的原版例子
window.color = '红色的'; //或者var color = '红色的';也行
var box = {
color : '蓝色的'
};
function sayColor() {
alert(this.color); //这里第一次在外面,第二次在box 里面
}
getColor();
box.sayColor = sayColor; //把函数复制到box 对象里,成为了方法
box.sayColor();

四.函数属性和方法
ECMAScript 中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:
length 和prototype。其中,length 属性表示函数希望接收的命名参数的个数。
function box(name, age) {
alert(name + age);
}
alert(box.length); //2
PS:对于prototype 属性,它是保存所有实例方法的真正所在,也就是原型。


call()方法于apply()方法相同,他们的区别仅仅在于接收参数的方式不同。对于call()方
法而言,第一个参数是作用域,没有变化,变化只是其余的参数都是直接传递给函数的。

事实上,传递参数并不是apply()和call()方法真正的用武之地;它们经常使用的地方是
能够扩展函数赖以运行的作用域。


事实上,传递参数并不是apply()和call()方法真正的用武之地;它们经常使用的地方是
能够扩展函数赖以运行的作用域。
var color = '红色的'; //或者window.color = '红色的';也行
var box = {
color : '蓝色的'
};
function sayColor() {
alert(this.color);
}
sayColor(); //作用域在window
sayColor.call(this); //作用域在window
sayColor.call(window); //作用域在window
sayColor.call(box); //作用域在box,对象冒充

使用call()或者apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合

关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说,box 对象和
sayColor()方法之间不会有多余的关联操作,比如box.sayColor = sayColor;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 完税凭证丢了怎么办 开票开错了怎么办 上海居住证搬家了怎么办 上海无户口 医保怎么办 淘宝账号注销不了怎么办 淘宝账号被覆盖怎么办 淘宝号注册不了怎么办 appleid密码忘了怎么办 蘑菇街用白富美后忘记账号怎么办 不知道宽带账号怎么办 上网用户名忘了怎么办 别人借淘宝号怎么办 不知道ipad密码怎么办 捡的ipad密码怎么办 12306注册名已存在怎么办 忘记网银用户名怎么办 登录用户名忘了怎么办 网银登录错误怎么办 路由器账号忘了怎么办 忘记宽带账号密码怎么办 12123被注册过怎么办 w10不能创建账户怎么办 忘记xp登录密码怎么办 华硕密码忘记了怎么办 电脑账户已停用怎么办 鼠标灯亮不动怎么办 电脑用户名被停用怎么办 电脑截图不清晰怎么办 win10电脑磁盘空间不足怎么办 我的用户名忘记怎么办 12306用户名密码忘记怎么办 电脑开机要密码怎么办 三星账户忘记了怎么办 电脑账户忘记了怎么办 电脑启动要密码怎么办 电脑用户密码忘记了怎么办 微信语音听不懂怎么办 法院迟迟不立案怎么办 dns连不上网怎么办 监控显示无硬盘怎么办 电脑获取不到dns怎么办