JavaScript中Function详解

 更新时间:2015年02月27日 09:41:13   投稿:hebedich  
函数是由关键字function、函数名加一组参数及置于大括号中需要执行的一段语义定义的。今天我们就来详细讲解一下JavaScript中的Function。

关键字function用来定义函数。

复制代码 代码如下:

//函数声明式定义:
function funcname([arg1[,args[...,argn]]]){
 statements
}
//函数表达式定义:
var funcname = function ([arg1[,args[...,argn]]]){
 statements
};

注意,function语句里的花括号是必需的,即使函数体只包含一条语句。

在JavaScript中,函数是Function类的具体实例。而且都与其它引用类型一样具有属性和方法。

函数名实际上是指向函数对象的指针,函数可以作为参数参与到传参和返回值中。

函数的对象特性

因为函数是Function的实例,而函数名仅仅是该实例的一个引用地址。因此可以作为参数和返回值参与到函数的传参过程中。

复制代码 代码如下:

function call_some_function(some_function, some_argument) {
    return some_function(some_argument);
}
function add_10(num) {
    return num + 10;
}
console.log(call_some_function(add_10,20)); //30

函数的内部属性

arguments | this
•arguments对象中保存着传递给函数的参数
•arguments.length返回传入参数的个数
•Note: length属性表示函数定义时候默认接收的参数数量。arguments.length表示函数实际执行时接收的参数数量。

复制代码 代码如下:

function test_arguments() {
    if (arguments.length == 2) {
        console.log(arguments.length);
        console.log(arguments);
    } else {
        console.log(arguments.length);
        console.log(arguments);
        arguments.callee(4, 5);
    };
}(1, 2, 3)
/**
 3
{ '0': 1, '1': 2, '2': 3 }
2
{ '0': 4, '1': 5 }
 **/

•arguments.callee()主要用在递归函数中调用函数自身的情境中。js和别的语言不同在于函数名只是一个指针,可以随时变化,函数中利用函数名来调用自身属于高耦合,可能会出现问题,而arguments.callee()调用自身就会规避掉这个问题

复制代码 代码如下:

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    };
}
function callee_f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    };
}
factorial(10); //运行正常
f = factorial;
factorial = null;
f(10); //error
callee_f(10); //运行正常
f = callee_f;
callee_f = null;
f(10); //运行正常

•this主要用来帮助函数引用函数所处作用域中的对象。

复制代码 代码如下:

var color = 'red';
function syaColor() {
    console.log(this.color);
}
syaColor(); //red
var o = new Object();
o.color = 'blue';
o.sayColor = sayColor;
o.sayColor(); //blue

call()和apply()

call()和apply()是每个函数都包含的自有方法。之前已经提到了函数是定义的对象,那么调用函数时候,函数中的this是对当前与下变量的调用。而如果想改变函数执行所在域空间,则可以使用call()和apply()来实现。

复制代码 代码如下:

color = 'red';
var o = {color: 'blue'};
function sayColor() {
    console.log(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(o); //blue

app()和call()的作用是相同的,区别主要在于传入参数的不同。

call(this,para1,prar2,prar3) 第一个参数是函数要执行的作用域,后面的参数是函数的输入参数,有多少个依次写多少个。

apply(this,[para1,para2,prara3])第一个参数也是函数要执行的作用域,后面是一个Array的数组对象。

使用call()/apply()来扩充作用域最大的好处是对象和方法的解耦。

内置对象

Global对象可以理解成最外层的对象,所有的对象,以及不属于其它对象的属性和方法都被包含在Global对象中。
* isNaN(x) 用来检查参数x是否为数字。如果为数字返回false,否则返回true
* isFinite(x) 用来检查参数x是否为无穷大/小,如果是无穷大/小,则返回true
* parseInt(x) 用来解析字符串并返回整数
* parseFloat(x) 用来解析字符串并返回浮点数
* encodeURI()和encodeURIComponent()会对字符串进行特殊的UTF-8编码,规避一些特殊字符来让浏览器能够读懂。他俩的区别主要在于encodeURI()不会对本身属于URI的特殊字符进行编码,而encodeURIComponent()会对其发现的所有非标准字符进行编码。

复制代码 代码如下:

var uri = "http://www.wrox.com/illegal value.htm#start";
//http://www.wrox.com/illegal%20value.htm#start
console.log(encodeURI(uri))
//http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start
console.log(encodeURIComponent(uri))

•对应的解码函数为decodeURI()和decodeURIComponent()
•eval(script) 用来将script的内容在解释器中执行并返回对应的结果。非常强大!

Note:在浏览器中,windows对象封装了Global对象,并承担了很多额外的任务和功能。

Math对象为另一个内置对象。为JavaScript提供了数学计算功能。

以上就是本文的全部内容了,希望小伙伴们能够喜欢,能够对大家有所帮助。

相关文章

  • 详解JavaScript是如何验证URL的

    详解JavaScript是如何验证URL的

    当开发者需要为不同目的以不同形式处理URL时,我们经常会借助于JavaScript。本文就为大家整理了JavaScript验证URL的方法,希望对大家有所帮助
    2023-02-02
  • js实现iframe跨页面调用函数的方法

    js实现iframe跨页面调用函数的方法

    这篇文章主要介绍了js实现iframe跨页面调用函数的方法,实例展示了iframe中父页面调用子页面和子页面调用父页面的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • Three.js中实现一个OBBHelper实例详解

    Three.js中实现一个OBBHelper实例详解

    这篇文章主要介绍了Three.js中实现一个OBBHelper,本文参考Box3Helper源码,并写出一个OBBHelper,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • javascript结合CSS实现苹果开关按钮特效

    javascript结合CSS实现苹果开关按钮特效

    这篇文章主要介绍了javascript结合CSS实现苹果开关按钮特效的方法以及全部代码,效果非常不错,兼容性也很好,有需要的小伙伴自己参考下
    2015-04-04
  • javascript打印html内容功能的方法示例

    javascript打印html内容功能的方法示例

    这篇文章主要介绍了javascript打印html内容的小示例,大家参考使用
    2013-11-11
  • JS设计模式之命令模式的用法详解

    JS设计模式之命令模式的用法详解

    JavaScript中的命令模式是一种设计模式,它提供了一种将命令封装为对象的方式,从而允许我们将请求与实际执行该请求的操作对象解耦,这种模式可以在不同的场景中使用,例如实现撤销/重做操作、队列任务等,本文我们将讲解命令设计模式在JS中的使用
    2023-08-08
  • ES6中的数组扩展方法

    ES6中的数组扩展方法

    这篇文章主要介绍了ES6中的数组扩展方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • javascript如何在foreach循环完成之后执行一个回调函数

    javascript如何在foreach循环完成之后执行一个回调函数

    forEach()是前端开发中操作数组的一种方法,主要功能是遍历数组,其实就是 for 循环的升级版,下面这篇文章主要给大家介绍了关于javascript如何在foreach循环完成之后执行一个回调函数的相关资料,需要的朋友可以参考下
    2023-11-11
  • 微信小程序反编译的实现

    微信小程序反编译的实现

    这篇文章主要介绍了微信小程序反编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 前端JavaScript获取电池信息

    前端JavaScript获取电池信息

    受到同事启发,突然发现了几个有趣又实用的web api,下面这篇文章主要给大家介绍了关于前端JavaScript获取电池信息的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论