Function对象
对象中的函数(方法)
当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象。
方法可以使用this访问自己所属的对象;
return
一个函数纵使会返回一个值。如果没有指定返回值,则返回 undefined。
如果函数调用时在前面加上了 new 前缀,且返回值不是一个对象, 则返回 this(该新对象);
在jquery的on方法下,得到绑定函数的返回值;
var returnValue; //通过变量来存储函数的返回值;function a(){
return 123456;
}$(".h1").on("click",function a(){
returnValue = a();
alert(returnValue); // 123456
});
方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时, this被绑定到该对象。 如果调用表达式包含一个提取属性的动作(既包含一个
. 点表达式或[subscript]下标表达式),那么它就是被当作一个方法来调用;
函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当作一个函数来调用的:
var sum = add(3, 5); // sum的值为8;
以此模式调用函数时,this
被绑定到全局对象。这是语言设计上的一个错误,对于对象中方法的内部函数,如果我们需要让this指向对象但我们可以通过一个简单的方法:在方法定义一个变量并给它赋值为this,这样内部函数引用方法创建的变量,this的指向就是方法的所属对象了;
1 var myObject = new Object();
2 myObject.value = 0;
3
4 function add(num){
5 return num * num;
6 }
7 myObject.double = function (){
8 var here = this; //指向为当前方法所属对象;
9
10 var helper = function (){
11 var that = this;//指向依旧为window;
12 that.value = add(50); //window.value = 2500;
13 here.value = add(100); //myObject.value = 10000;
14 }
15 helper();
16 }
17
18 myObject.double();
19 document.writeln((myObject.value)); //10000;
20 document.writeln((window.value)); //2500;
构造器调用模式
一个函数,如果创建的目的就是希望接合 new
前缀来调用,那么它就被称为构造器函数,按照约定,他们保存在首字母以大写格式命名的变量里。如果调用构造器函数时没有在前面加上
new,可能会发生非常糟糕的事,既没有编译时警告,也没有运行时警告,所以大写约定非常重要!(不推荐使用这种形式的构造函数,下一章有更好的替代方式[js语言精粹30页]);
Apply
调用模式
因为JS是一门函数式的面向对象编程语言,所以函数可以拥有方法。
apply 方法让我们构建一个参数数组传递给调用函数,它也允许我们选择 this 的值。 apply 方法接收两个参数, 第 1 个是要绑定给 this
的值,第 2 个就是一个参数数组. 1 function add(num1, num2){
2 return num1 + num2;
3 }
4
5 // 构造一个包含两个数字的数组,并将他们相加;
6 var array = [3, 4];
7 var sum = add.apply(this, array);
8 alert(sum);
9
10
11 var Quo = function (string) {
12 this.statues = string;
13 }
14
15 // 给 Quo 的所有实例提供一个名为 get_statues 的公共方法;
16
17 Quo.prototype.get_statues = function (){
18 return this.statues;
19 }
20
21 var statuesObject = {
22 statues: "A-OK"
23 };
24
25 var statues = Quo.prototype.get_statues.apply(statuesObject); //statues 值为 "A-OK";
26
//以上 apply 的代码我还没弄明白- -
arguments
参数
当函数被调用时,会得到一个“免费“配送的参数, 那就是 arguments 数组,函数可以通过此参数访问所有它被调用时传递给它的参数列表。
因为语言的一个设计错误, arguments 并不是一个真正的数组, 它只是一个 ”类似数组 (array-like)“ 的对象。 arguments
拥有一个 length 属性,但它没有任何数组的方法。我们将会在本章结尾看到这个设计错误导致的后果 (语言精粹p30);
JS Function对象札记