/*
*1.函数定义
* 函数定义最常用的方法是调用function语句。
* 该语句由关键词function构成,紧随其后跟的是函数名(可选)、
* 参数列表(使用括号括起来,括号必选,列表可选,参数使用逗号
* 分割开来)、函数体(大括号括起来,大括号必选,内容可选)。
*/
//函数可以有返回值,使用return 语句;也可以没有返回值
function test_return(){
return window.alert("test_call");
}
/**
* 2.使用Function()构造函数和new定义函数。
* 下面的定义等价于 function f(x, y){return x*y;}
* Function构造函数可以接受任意多个字符串参数。它的最后一个参数是函数的主体,其中可以包含任何javascript语句,语句之间使用分号分割,其他的参数都是说明函数的参数的。
* 注意:传递给构造函数Function()的参数中没有一个用来说明函数名的,所以也成“匿名函数”。
*/
var f = new Function("x", "y", "return x*y");
/**
* 3.使用函数直接量定义函数
* 函数直接量是一个表达式,它可以定义匿名函数,结尾有分号。函数直接量的语法和function语句非常相似,只不过他被用作表达式,而不是语句,而且也无需制定函数名。
* 函数直接量表达式指定的函数可以存储在一个变量中,可以传递给其他的函数甚至被直接调用。
*/
function f1(x, y){return x*y;} //使用function语句定义
var f2 = new Function("x", "y", "return x*y;"); //使用Function和new定义
var f3 = function(x, y){return x*y;}; //使用函数直接量定义,赋值给变量f3
a[0] = function(x){return x*x;} //定义一个函数并保存它
a.sort(function(a, b){return a-b;}); //定义一个函数,把它传递给另一个函数
var tensquared = (function(x){return x*x;})(10); //定义一个函数并调用它,把结果赋值给一个变量
/**
* 4.作为数据的函数
* 函数可以被赋值给变量、存储在对象的属性中或存储在数组的元素中、传递给函数等等。
* 下面创建了一个函数对象,并把这个对象赋值给了变量square。实际上,函数名并没有什么实质意义,它不过是用来存放函数的变量的名字。
*/
function square(x){return x*x;}
/**
* 函数作为数据的例子
*/
//我们定义了四个简单的函数
function add(x, y){return x+y;}
function substract(x, y){return x-y;}
function multiply(x, y){return x*y;}
function divide(x, y){return x/y;}
//下面这个函数使用上面某个函数作为参数,同时传入两个参数,返回运算结果
function operate(ope1, ope2, ope){
return ope(ope1, ope2);
}
//可以使用上面的函数计算(2+3)-(4*5)
var i = operate(operate(add, 2, 3), operate(multiply, 4, 5), substract);
//下面把函数保存到数组中,使用函数直接量形式定义
var opes = new Object();
opes['add'] = function(x, y){return x+y;};
opes['substract'] = function(x, y){return x-y;};
opes['multiply'] = function(x, y){return x*y;};
opes['divide'] = function(x, y){return x/y;};
opes['pow'] = Math.pow;
//以下的函数将运算符作为参数,在数组中检索这个运算符,然后对运算符调用检索到的函数。注意调用这个运算符函数的语法。
function operate2(ope1, ope2, opt_name){
if(opes[opt_name]==null)return "unknown operator";
else return opes[opt_name](ope1, ope2);
}
//下面计算("hello" + " " + "world");
var j = operate2("hello", operate2(" ", "world", "add"), "add");
/**
* 5.arguments标识符
* javascript函数的主体实在局部作用域中执行的,该作用域不同于全局作用域。这个新作用域是通过把调用对象添加到作用域链的头部
* 创建的。因为调用对象是作用域链的一部分,所有在函数体内可以把这个对象属性作为变量来访问。用var语句声明的局部变量创建后作为调用对象的属性,而且函数的形式参数也可用于对象的属性。
* 除了局部变量和形式参数外,调用对象还定义了一个特殊属性,名为arguments。这个属性引用了另外一个特殊的对象——Arguments对象。该对象属于函数调用环境。
* 在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。
* 但是它并非真正的Array对象。Arguments对象也定义了callee属性。
*
* 尽管定义函数时有固顶数目的命名参数,但是当调用这个函数时,传递给它的参数数目却可以是任意的。arguments属性支持[]运算符。
* 注意:中括号里面是索引值,从0开始。arguments[]可以完全地存取那些实际参数值,即使某些参数没有被定义。如arguments[0]表示第一个形式参数的值。
*
* 使用arguments[]可以帮助我们编写能够接受任意数目实际参数的函数。
*
* arguments[]不是数组,它表示的是Arguments对象。Arguments对象有一个非同寻常的特性。当函数定义了形式参数时,arguments[]里面存放的元素就是形式参数的值。arguments[]和形式参数不过是引用同一变量的两种不同方法。
* 通过任何一种方式改变值都会影响两一种方式的值。
*
* 下面定义了一个匿名函数(第一个括号内的函数),函数体首先输出参数值,然后赋值null,再次输出参数值。定义函数后调用它,同时传递给它一个实际参数5.
*/
(function(x){window.alert(x); x=null; window.alert(x);})(5); //第一次输出是5,第二次输出是null
/**
* 6.callee属性
* Arguments对象除了有arguments属性,还有callee属性,用来引用当前正在执行的函数。这对匿名函数调用自身非常有用。
* 下面是一个计算阶乘的匿名函数.
*/
var v = function(x){if(x<=1)return 1; else return x*arguments.callee(x-1);}
window.alert(v(5));
/**
* 7.Function函数对象
* 函数是一种javascript对象,就行String对象和Date对象一样。同样具有属性和方法。
* Function对象具有length,这是个只读属性,该属性确切地说明了一个函数声明的形式参数的个数。不同于arguments的属性,arguments.length表示函数实际接收到的参数个数。
* 下面的check函数会检测函数接收到的实际参数个数和定义的参数个数是否相等,不等的话抛出错误。f函数应用了check函数。最后输出应该报错。
* 另外,Function对象还有一个prototype属性,表示预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用。它在定义新的对象类型时起着非常重要的作用。
*/
function check(args){
var actual = args.length;
var expected = args.callee.length;
if(actual != expected){
throw new Error("Wrong number of arguments: expected:"+expected+" ;but actually passed "+actual);
}
}
function f(x, y, z){
check(arguments);
return x+y+z;
}
window.alert(f(2,5));
/**
* 8.Function对象的apply方法和call方法
* 所有函数都有这两个方法。使用这两个方法就像用其他对象的方法医用。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的参数。
*/
var o = new Object();
function f(x, y){return x+y;}
o.m = f;
window.alert(o.m(2,5)); //以上两行代码等价于f.call(o,2,5);
//apply()方法的参数和call()方法类似,只是传递给函数的参数时候数组指定的。如上面可以写成f.apply(o,[2,5]);
分享到:
相关推荐
首先,JavaScript中的Function类型是一个对象,也即引用类型,这表明它与JavaScript的基本类型如数字、字符串等有本质上的不同。它是独立于Object类型的一个特殊类型。当你使用typeof操作符检查函数时,返回值为...
JavaScript中的Function是编程的核心组成部分,它允许我们定义可重复使用的代码块,以便在需要时执行特定的任务。在JavaScript中,函数既是一种数据类型,也是一种执行上下文。它们可以通过两种方式定义:函数声明式...
Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念,接下来通过本篇文章给大家介绍javascript中的function多重理解,小伙伴们...
注意:官方定义: 在Javascript中,每一个函数实际上都是一个函数对象. 我们先来看最简单的两个代码,也是最容易理解的. function fn(){} var obj = {} console.log(fn instanceof Function)//true conso
JavaScript 中的 function 使用方法 JavaScript 中的 function 使用方法可以分为两种:作为普通逻辑代码容器和作为对象。 一、function 作为普通函数 在 JavaScript 中,function 可以作为普通函数使用,类似于 C...
总结起来,JavaScript中`function`的`length`属性是一个反映函数定义时形参数量的特性。它对于了解函数的基本结构和预期参数数量很有帮助,但在处理动态参数或使用`arguments`对象时,要注意它不会提供实际传入的...
在JavaScript中,Function和Object是两个非常重要的概念,它们之间存在着紧密的关系。在这篇文章中,我们将深入探讨Function和Object的关系,了解它们之间的联系和区别。 Function:函数对象 ---------------- 在...
首先给大家介绍JavaScript中function定义函数的几种方法: 1.最基本的作为一个本本分分的函数声明使用。 复制代码 代码如下: function func(){} 或 复制代码 代码如下: var func=function(){}; 2.作为一个类构造...
在JavaScript中,`Function`构造函数是一个特殊的功能,允许我们动态地创建和定义函数。这是一种高级用法,通常在需要在运行时根据某些条件构建函数体或者需要将函数作为值进行传递时使用。下面我们将详细探讨`...
本PPT主要介绍了JavaScript中的OOP概念,包括Function对象的apply方法、自定义对象、封装、继承以及多态。 **apply()方法**是JavaScript中Function对象的一个内置方法,它的作用是改变函数调用时的上下文(即`this`...
### JavaScript中的Function应用详解 #### 一、基本概念与用法 在JavaScript中,`Function` 是一个内置对象,它允许我们创建动态的函数。它不仅支持传统的函数声明,还能用于构建复杂的对象模型和实现一些高级特性...
JavaScript中的`function`函数是其核心特性之一,它允许我们定义可重复使用的代码块,能够封装任意数量的语句,并且可以在程序的任何位置被调用。JavaScript的函数与许多其他编程语言(如C)相比,具有独特的特点,...
JavaScript中的Function类型是编程语言的核心概念之一,它既是创建可执行代码的构造器,也是一种数据类型。在JavaScript中,函数是一种一等公民,这意味着函数可以作为变量赋值、作为参数传递,甚至作为其他函数的...