js_function

/**
* 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]);

原文地址:https://www.cnblogs.com/beidao/p/2467619.html