首页 > 代码库 > JS Function对象札记

JS Function对象札记

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 = http://www.mamicode.com/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 = http://www.mamicode.com/add(50); //window.value = http://www.mamicode.com/2500;
13                     here.value = http://www.mamicode.com/add(100); //myObject.value = http://www.mamicode.com/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);