精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
函数在JavaScript里是一个很重要的部分,JavaScript有很多内置函数,程序员可以直接使用这些内置函数,也可以自定义函数以供程序使用。
在JavaScript中,函数是Function类的具体实例。而且都与其它引用类型一样具有属性和方法。函数名实际上是指向函数对象的指针,函数可以作为参数参与到传参和返回值中。
//函数声明式定义 function foo(num1,num2){ return num1 + num2; } //函数表达式定义 var foo = function(num1,num2){ return num1 + num2; }; //使用Function构造函数定义 var foo = new Function("num1","num2","return num1 + num2"); //实际上创建一个Function实例并不一定要赋值给具体的指针,可以直接执行 (function(x,y){return x+y})(1,2); //之所以用圆括号把function(){}括起来是因为js解释器会将function解释为函数声明,而函数声明不能直接跟着(x,y),我们需要将其转换为函数表达式。 //(1,2)表示要传递跟函数的参数。 //上面的例子也可以写成: function foo(x,y){ return x+y; }(1,2); //函数声明的方式无法定义匿名函数,因此如果想使用匿名函数,则必须用函数表达式的定义方式。
与其他语言不同,ECMAScript函数不介意传递进来多少个参数,也不在乎是什么类型。因为实参在内部是用一个类数组来表示的,函数接收到的始终是个类数组。可以看出,ECMAScript函数的一个重要特点:命名参数(形参)只提供便利,但不是必须的。
注意:js中方法本身是没有重载的,因为:
1.方法的本质就是一个Function类型的变量,如果出现同名的变量,会覆盖!
2.但是依靠函数内部属性argument来模拟重载!
//模拟函数重载! function testArgument() { if (arguments.length == 1) { alert("哈哈~1"+arguments[0]); } else if (arguments.length == 2) { alert("哈哈~2" + arguments[0] + "," + arguments[1]); } else { alert("哈哈~3"); } } testArgument(); testArgument(1); testArgument(1, 2);
this引用的是函数据以执行操作的对象,也就是函数在执行时所处的作用域通俗:就是哪个对象.出了这个函数,那么函数里的this就代表哪个对象
例子:window.color = "blue";
var o = { color: "red" };
function sayColor() {
alert(this.color);//谁.出这个方法,这个this就是谁
}
sayColor();//blue,因为引用函数的是window对象,作用域中的this都是指window.
o.sayColor = sayColor;
o.sayColor();//red,
先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来执行方法,this即指当前的myobject 对象。
var blogInfo={
blogId:123,
blogName:"werwr",
showBlog:function(){alert(this.blogId);}
};
blogInfo.showBlog();
定义一个函数,设置一个变量名保存函数,这时this指向到window对象。
var myfunc = function(a,b){
return a+b; } alert(myfunc(3,4));
定义一个函数对象,在对象中定义属性,在其原型对象中定义方法。在使用prototype的方法时,必须实例化该对象才能调用其方法。
var myfunc = function(a){
this.a = a;
};
myfunc.prototype = {
show:function(){alert(this.a);}
} var newfunc = new myfunc("123123123");
newfunc.show();
var myobject={};
var sum = function(a,b){
return a+b;
};
var sum2 = sum.call(myobject,10,30); //var sum2 = sum.apply(myobject,[10,30]);
alert(sum2);