《JavaScript语言精粹》笔记--函数的调用

来源:互联网 发布:java泛型里的? 编辑:程序博客网 时间:2024/05/16 03:20

函数除了声明时定义的形式参数外,还接收两个附加的参数:this和arguments。

JavaScript中的this总是指向一个对象,而具体指向哪个对象取决于函数调用的模式,而非函数被声明时的环境。

在JavaScript中有四种调用模式:(1)方法调用模式(2)函数调用模式(3)构造器调用模式(4)apply调用模式。

(1)方法调用模式

当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象(换句话说,this到对象的绑定发生在调用的时候)。

var obj = {    value: 0,    increment: function() {        this.value+=1;    }};obj.increment();
(2)函数调用模式

当一个函数并非一个对象的属性时,那么它被当作一个函数来调用。

例1:

var value;function increment(){  this.value++;}increment();

因为没有明确指定调用函数时的对象,因此increment函数中的this是指向了全局对象window

例2:

var value = 500; var obj = {    value: 0,    increment: function() {        this.value++;        var innerFunction = function() {            alert(this.value); //500        }        innerFunction();     }}obj.increment();
同样,它里面的this指向的是全局对象window。


若想要this指向obj对象,就定义一个变量that并给它赋值为this,那么内部函数就可以通过that变量访问到this。

例3:

var value = 500; var obj = {    value: 0,    increment: function() {        var that = this;        that.value++;        var innerFunction = function() {            alert(that.value);  //1         }        innerFunction();     }}obj.increment();
(3)构造器调用模式

如果在一个函数前面加上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上

var Quo = function (string){      this.status = string;};Quo.prototype.get_status = function(){       return this.status;};var myQuo = new Quo ("confused");alert(myQuo.get_status());

(4)apply调用模式

var add = function(num1, num2) {        return num1+num2;}array = [3,4];add.apply(null,array);

注意:apply第一个参数传递为null,并不是说将add函数的运行上下文环境设置为null,而是设置为全局对象window。


总结this指向:

1、作为普通函数调用(this指向全局对象window对象)
2、作为对象的方法调用(this指向该对象)
3、构造器调用(this指向用new返回的这个对象)
4、call、apply、bind的调用(this指向第一个参数对象)

原创粉丝点击