在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()方法相同,第二个参数是原来参数序列......。

javascript函数调用的各种方法!!的更多相关文章

  1. javascript函数调用中的方法调用模式

    最近想起来之前看过的一种js语法,感觉很实用,但是又想不起来具体的写法.然后在网上浏览了一段时间,终于成功的再现了记忆中的那种语法,嗯~,还是那个熟悉的味道! 代码如下: <script> ...

  2. 5种 JavaScript 调用函数的方法

    一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性 ...

  3. JavaScript调用函数的方法

    摘要:这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正 ...

  4. JavaScript 函数调用

    JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象. 注意 this ...

  5. JavaScript函数调用规则

    1. [代码][JavaScript]代码     JavaScript函数调用规则一 (1)全局函数调用:function makeArray( arg1, arg2 ){    return [t ...

  6. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  7. JavaScript document属性和方法

    JavaScript document属性和方法 --------------------------------------------属性: 1. Attributes     存储节点的属性列表 ...

  8. 将JavaScript 插入网页的方法

    将JavaScript 插入网页的方法 使用Javascript代码. 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的. ...

  9. JavaScript常用对象的方法和属性

    ---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...

随机推荐

  1. Docker学习笔记

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  2. 手写原生ajax

    关于手写原生ajax重要不重要,各位道友自己揣摩吧, 本着学习才能进步,分享大家共同受益,自己也在自己博客里写一下 function createXMLHTTPRequest() { //1.创建XM ...

  3. LINQ系列:LINQ to XML查询

    1. 读取XML文件 XDocument和XElement类都提供了导入XML文件的Load()方法,可以读取XML文件的内容,并转换为XDocument或XElement类的实例. 示例XML文件: ...

  4. 使用HTML5里的classList操作CSS类

    在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...

  5. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为’A’   成绩>=最高分-20  等级为’B’ 成绩>=最高分-30  等级为’C’ ...

  6. sublime text学习

    Ctrl + /  ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N-------------------新建 软件右下 ...

  7. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  8. 在Linux(ubuntu server)上面安装NodeJS的正确姿势

    上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 h ...

  9. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  10. geotrellis使用(六)Scala并发(并行)编程

    本文主要讲解Scala的并发(并行)编程,那么为什么题目概称geotrellis使用(六)呢,主要因为本系列讲解如何使用Geotrellis,具体前几篇博文已经介绍过了.我觉得干任何一件事情基础很重要 ...