在JavaScript中一共有下面4种调用方式:
(1) 基本函数调用
(2)方法调用
(3)构造器调用
(4)通过call()和apply()进行调用
1. 基本函数调用

普通函数调用模式,如:

JavaScript code?
1
2
3
4
  function fn(o){
     …… 
  }
  fn({x:1});

在基本函数调用中,
(1)每个参数作为实参传递给声明函数时定义的形参;
(2)this被绑定到全局变量(直接调用一般指的是window)

JavaScript code?
1
2
3
4
5
6
7
8
9
10
  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?
1
2
3
4
5
6
7
8
9
10
11
  
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?
1
2
 function fn(){……}
 var obj = new fn();

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

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

JavaScript code?
1
2
  var obj = new Object();
  var obj = new Object;

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

JavaScript code?
1
2
3
4
5
6
7
8
9
10
 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()方法相同,第二个参数是原来参数序列......。

转载于:https://www.cnblogs.com/msidevs/p/6058232.html

javascript函数调用的各种方法!!相关推荐

  1. Javascript函数调用的四种方法

    2019独角兽企业重金招聘Python工程师标准>>> 一.方法调用模式 函数作为对象的属性时,称为方法.此时函数(即方法)中的this对应是该对象. var myObject = ...

  2. 【学习笔记】Javascript函数调用

    Javascript函数调用 函数调用 函数定义后,并不会自动执行,需要通过调用来实现.在JS中调用通常有四种方式: 函数调用模式: 方法调用模式: 构造器调用模式: apply.call调用模式: ...

  3. JavaScript函数调用规则

    JavaScript函数调用规则一 (1)全局函数调用: function makeArray( arg1, arg2 ){     return [this , arg1 , arg2 ]; } 这 ...

  4. javascript操作数组的方法大全

    javascript操作数组的方法大全 一.ES5数组的方法 1.Array.isArray() 用来判断是否为数组 var arr = [1, 2, 3, 4, 5]; var obj = {}; ...

  5. javascript调用java的方法

    这篇文章主要讲述如何在JavaScript脚本语言中调用Java类和接口,对大家的学习和工作有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧. 前言 本文中所有的代码使用 JavaScript 编 ...

  6. JavaScript对象属性及方法

    JavaScript对象属性及方法 1.对象属性 JavaScript对象时属性变量的容器,以键值对name:value的形式存在,访问方式为 name.value name[value] 2.对象方 ...

  7. Javascript中二进制数据处理方法

    Javascript中二进制数据处理方法 转载于:https://www.cnblogs.com/motadou/archive/2012/02/19/2358514.html

  8. 在js中加html_在HTML文档中嵌入JavaScript的四种方法

    在HTML里嵌入JavaScript 在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内嵌,放置在标签之间  (少): 2.放置在有 3.放置自HTML事件处理程序中,该事件处理程 ...

  9. 创建JAVASCRIPT对象3种方法

    创建JAVASCRIPT对象3种方法 方法一:直接定义并创建对象实例 var obj = new Object();    //创建对象实例 //添加属性obj.num = 5;   //添加属性 o ...

最新文章

  1. SQL SERVER中强制类型转换cast和convert的区别
  2. SAP Spartacus 单元测试开发规范
  3. Angular workspace默认的packages
  4. 【Python基础入门系列】第03天:Python 变量与数据类型
  5. Leetcode 209.长度最小子序列(滑动窗口)
  6. Android Jetpack 之 ViewModel
  7. android 中 FLAG_SHOW_WHEN_LOCKED 的用法及解释
  8. 测试“测试”的“测试”
  9. 如何卸载jdk_Java新手怎样安装JDK,手把手教你如何安装JDK
  10. spark读写Oracle、hive的艰辛之路(一)
  11. 编码的奥秘:存储器组织
  12. PDMS中如何设置颜色规则
  13. 酒店机器人:酒店增收提质的新引擎
  14. Win10安装jdk11及环境变量配置
  15. 无聊之时用css3自制了好看的button样式和input样式
  16. 联合概率 条件概率 边缘概率之间关系
  17. switch语句及其嵌套
  18. 2007中文网志年会印象
  19. 以flv.js框架为基础,替换flv格式视频
  20. linux qq x64,QQ Linux 版时隔多年再次更新,支持 x64、ARM64 等多种架构

热门文章

  1. 【POJ - 1456】Supermarket (贪心,优先队列 或并查集)
  2. 【Codeforces - 632C】The Smallest String Concatenation (对string巧妙排序)
  3. Thymeleaf模板引擎处理日期输入框回显问题type=“date“类型的坑 和 单选按钮、复选框的回显
  4. java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)
  5. oracle命令行打不开,关于oracle命令行上下左右键没法使用解决办法
  6. nodejs复制服务器文件,nodejs文件夹深层复制功能
  7. html中选择省份城市,省份、城市、区县三级联动Html代码
  8. 苏州大学实验报告模板C语言,苏州大学实验报告-实验flash在线编程实验
  9. 最强阿里巴巴历年经典面试题汇总:C++研发岗
  10. 关系数据库——视图/存储过程/触发器