首页 技术 正文
技术 2022年11月11日
0 收藏 647 点赞 4,430 浏览 2108 个字

在JavaScript中一共有下面4种调用方式:

(1) 基本函数调用

(2)方法调用

(3)构造器调用

(4)通过call()和apply()进行调用

1. 基本函数调用

普通函数调用模式,如:

JavaScript code?

1234   function fn(o){     ……   }  fn({x:1});

在基本函数调用中,

(1)每个参数作为实参传递给声明函数时定义的形参;

(2)this被绑定到全局变量(直接调用一般指的是window)

JavaScript code?

12345678910   var object = {value:1};  var value = 2; object.printProps = function(){    var printValue = function(){      console.log(this.value);    };   printValue();   console.log(this.value); } object.printProps();

此时的运行结果是:

 2

 1

在printValue()函数在执行时,this.value值为2,也就是说,this指向的是全局对象,而不是对象object。

(3)返回值:函数的返回值成为调用表达式的值。

I. 如果函数返回是解释器到达结尾,也就是没有执行到return XXX的语句。返回值为undefined。 

II. 如果函数返回是因为接受器执行到return xxx语句, 返回return之后的值。 

III. 如果return语句后没有值,即return,则返回undefined。

2. 方法调用

当一个函数被保存为对象的一个属性时,称为方法。

(1)参数和返回值的处理与函数调用一致;

(2)调用上下文this为该对象

JavaScript code?

1234567891011   function print(){    console.log(this.value);   }  var value=1;  var object = {value:2};  object.m = print;  //作为函数调用  print();  //作为方法调用  object.m();

运行结果为:

 1

 2

当调用print时,this绑定的是全局对象,打印全局变量value值1。

但是当调用object.m()时,this绑定的是方法m所属的对象Object,所以打印的值为Object.value,即2。

3. 构造器调用

 函数或方法调用之前带有关键字new,它就构成构造函数调用。如:

JavaScript code?

12  function fn(){……} var obj = new fn();

(1)参数处理:一般情况构造器参数处理和函数调用模式一致。但如果构造函数没用形参,JavaScript构造函数调用语法是允许省略实参列表和圆括号的。

如:下面两行代码是等价的。

JavaScript code?

12   var obj = new Object();  var obj = new Object;

(2)函数的调用上下文为新创建的对象。

JavaScript code?

12345678910  function fn(value){   this.value =value; } var value =1; var obj = new fn(2); console.log(value); console.log(obj.value); fn(3); console.log(value); console.log(obj.value);

运行结果:

 1

 2

 3

 2

 I. 第一次调用fn()函数是作为构造函数调用的,此时调用上下文this被绑定到新创建的对象obj。所以全局变量value值不变,obj新增一个属性value,值为2;

 II. 第二次调用fn()函数是作为普通函数调用的,此时调用上下为this被绑定到全局对象,在浏览器中为window。所以全局对象的value值改变为3,而obj的属性值不变。

(3)构造函数通常不使用return关键字,返回值为新对象。而如果构造函数显示地使用return语句返回一个对象,那么调用表达式值就为这个对象。如果构造函数使用return语句但没有指定返回值或者返回一个原始值,则忽略返回值,同时使用新对象作为调用结果。

4.通过call()和apply()进行调用

虽然在一个独立的函数调用中,根据是否是strict模式,this指向undefined或window,不过,我们还是可以控制this的指向的!要指定函数的this指向哪个对象,可以用函数本身的apply()或call()方法,它们都是接收两个参数。

call()方法使用它自有的实参列表作为函数的实参,apply()方法要求以数组的形式传入参数

apply方法第一个参数是改变后的调用对象,第二个参数是将函数参数以数组形式传入[ ],而call()第一个参数与call()方法相同,第二个参数是原来参数序列……。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,493
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,133
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297