函数调用的不同方式,以及this的指向

一、函数的调用方式

1.作为函数,一种直接易懂的方式(即函数调用模式)。

2.作为方法,方法是连接在对象上的,被这个对象调用,这种形式就是面向对象编程。

3.作为构造器,在构造的过程中一个新的对象被创建出来。

4.经由函数的apply或者call方法。

二、函数参数

1.传入参数

(1)传入变量多于函数定义变量。

(2)函数定义变量多余传入变量,多出来的变量是undefined

2.函数在被调用的时候,隐形的传入两个参数argument和this(即argument和this被悄悄传入函数,作用在函数的作用域中)。

(1)argument:函数调用时传入函数的变量集合(有arguemnt.length属性)

eg:argument[0]指的是传入函数的第一个参数

(2)this关联一个对象。

根据调用方式的不同,this的指向也不同。因此this为调用的上下文(invocation context)。

三、this的指向

1.函数调用模式 (this->window)

这个函数并不属于任何对象的属性。

function fn1(){
    //some code
}
fn1();
或着:
var fn2=function(){
    //some code
}
fn2();
使用这种方式调用函数,函数的上下文是全局上下文(global context即window)。this->window。

2.方法调用模式   (this->方法所属的对象)

这个函数是一个对象的属性,当这个函数被调用时,这个函数被视为这个对象的一个方法。

var obj={
    //some code;
};
obj.getname=function(){
    //some name
}
obj.getname();
函数的上下文是这个对象(例子中的 obj)。this->obj

3.构造器调用模式 (this->创建的新对象)

函数被作为构造器调用时有以下特点:

一个新的对象被创建出来;

这个新的对象被传递给这个构造器作为this参数,也就是说这个新的对象是构造器函数的上下文;

如果没有显性的return语句,这个新的对象会被隐式的return(就是悄咪咪的被return了),并成为这个构造器的值。

function Fn(){
    this.a=function(){
         return this;
    }
}
var n=new Fn();
console.log(n.a());//Fn{a:f}
console.log(n);//fn{a:f}
//此例中,构造了一个构造函数Fn((),利用new关键字调用时一个空的对象被创建出来,并传递到函数中作为this存在。this-Fn(新的)
//这个构造器同时创建了a属性,并将此属性作为一个方法赋予给它创建出新对象的实例。

4.apply()获得call()方法  (this->可以是我们指定的任何对象)

(1)apply(),两个参数。第一个参数:用于作为函数上下文的对象。第二个参数:一个参数数组。

(2)call(),两个参数。第一个参数:用于作为函数上下文的对象。第二个参数:argument list。

call()和apply()多用于函数回调。

function circle(list,calback){
    for(var i=0;i<list.length;i++){
         calback.call(list[i],i);
    }
}
var list=[‘a‘,‘b‘,‘c‘];
circle(list,function(index){
    console.log(index);//0,1,2(即传进来的i值)
    console.log(this);//a,b,c(call的第一个参数)
});
//this->call()传递进来的第一个参数。

参考书:

时间: 2024-12-19 08:12:46

函数调用的不同方式,以及this的指向的相关文章

js中this绑定方式及如何改变this指向

this的绑定方式基本有以下几种: 隐式绑定 显式绑定 new 绑定 window 绑定 箭头函数绑定 隐式绑定 第一个也是最常见的规则称为 隐式绑定. var a = { str: 'hello', sayHi() { console.log(this.str) } } a.sayHi() a 调用sayHi,所以this指向了对象a 我们来看一个类似但稍微高级点的例子. var wrapper = { name: 'user1', sayName() { console.log(this.n

Javascript读书笔记:函数定义和函数调用

定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方式: var add = new Function("m", "n", "alert(m+n);"); Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:&

this指向问题

1.谁最终调用函数,this指向谁.① this指向的,永远是对象!!! ②this指向谁,永远不取决于this写在哪,而是取决于函数在哪调用 ③this指向的对象,我们称之为函数的上下问context,也叫函数的调用者 2.this指向的规律(与函数调用的方式息息相关) this指向的情况,取决于函数调用的方式有哪些: ①通过函数名()直接调用:this指向window ②通过对象.函数名()调用的:this指向这个对象 ③函数作为数组的一个元素,通过数组的下标调用的:this指向数组④函数作

C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)

4.4 指向Member Function的指针 (Pointer-to-Member Functions) 取一个nonstatic data member的地址,得到的结果是该member在 class 布局中的byte位置(再加1),它是一个不完整的值,须要被绑定于某个 class object的地址上,才可以被存取. 取一个nonstatic member function的地址,假设该函数是nonvirtual,则得到的结果是它在内存中真正的地址.然而这个值也是不全然的,它也须要被绑定

通俗易懂------this指向

因为JavaScript 中this 是在运行期进行绑定的,因此JavaScript 中this 关键字具备多重含义. 具体在实际应用中,this的指向大致可以分为下面4种. 作为对象的方法调用   obj.a() 作为普通函数调用   a() 构造函数调用      var b = new a();  function.prototype.call或function.prototype.apply调用 作为对象的方法调用 和 作为普通函数调用 1 window.a = 2; 2 var obj

python小练习--函数调用函数,让对象具有能动性

1 class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 2 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入Box.__doc__查看这行说明文字了 3 openstate=0 4 def __init__(self):#这是类的构造函数,当实例化Box后会自动调用这个__init__方法 5 self.length=0.0 #这是实例属性,在类内访问用self.length,在类外访问用 实例名

探索javascript----this的指向问题

*this只和执行环境有关,和声明环境无关.谁调用this,this就指向谁. *this的指向分为四种: 1.作为普通函数调用: 2.作为对象的方法调用:   指向对对象,但用新变量引用该方法时候,又变为普通函数调用,指向window: 解释:方法其实就是一个对象中,属性赋了一个函数,而o.getN就代表这个函数,把它赋给一个新变量调用之,变成了普通函数调用. 3.在构造函数中,指向new运算符计算出来的实例对象. 4.apply调用: apply的作用是改变函数的调用对象,它的第一个参数就表

指向 Data Member 的指针及相关的效率影响

指向 data member 的指针是一个颇有用处的语言特性, 特别是如果你需要详细调查 class members 的底层布局的话.这个调查可以帮助你决定 vptr 是放在尾端还是起始处. 另一个用途是可以用来决定 clas 中 access sections 的次序.考察以下代码, 其中有一个 virtual function, 一个 static data member, 以及三个坐标值: class Point3d { public: virtual ~Point3d(); //...

浅谈this指向问题

刚开始学习js,被this弄得晕头转向,回过头来也想总结一下希望能帮助正被this'折磨'的人 我们先来看看直接执行this的情况 alert(this);//指向的是window 函数中执行 function foo(){ alert(this); } foo();//window 把函数赋值给变量执行 var foo = function(){ alert(foo); } foo();//window 上面直接执行的例子指向的都是window为什么会这样呢? 如果看过前面的学习总结一定知道,