函数调用的四种方式

在JavaScript中一共有4种调用模式:

  • 函数调用模式
  • 方法调用模式
  • 构造器调用模式
  • 间接调用模式,通过call()和apply()进行

1. 函数调用模式

普通函数调用模式,如:

function printProps(o){
  ……
}

printProps({x:1});

在一个调用中,

(1)每个参数表达式计算的结果作为实参传递给声明函数时定义的形参;

(2)this被绑定到全局变量

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

此时的运行结果是:

2
1

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

(3)返回值:函数的返回值成为调用表达式的值。I. 如果函数返回是解释器到达结尾,也就是没有执行到return XXX的语句。返回值为undefined。 II. 如果函数返回是因为接受器执行到return xxx语句,返回return之后的值。 III. 如果return语句后没有值,即return,则返回undefined。

2. 方法调用模式

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

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

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

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

运行结果为:

1
2

我们注意到,当调用printValue时,this绑定的是全局对象,打印全局变量value值1。但是当调用myObject.m()时,this绑定的是方法m所属的对象Object,所以打印的值为Object.value,即2。

3. 构造器调用模式

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

function F(){……}

var o = new F();

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

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

var o = new Object();
var o = new Object;

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

function Base(value){
  this.value =value;
}
var value =1;
var o = new Base(2);
console.log(value);
console.log(o.value);Base(3);console.log(value);console.log(o.value);

运行结果:

1
232

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

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

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

  函数调用模式 方法调用模式 构造器调用模式 间接调用模式
实参处理 参数表达式运行结果作为实参传递给函数形参 与函数调用模式一致
一般情况,与函数调用模式一致

但如果构造函数没用形参,JavaScript构造函数调用语法是允许省略实参列表和圆括号的


call()方法使用它自有的实参列表作为函数的实参

apply()方法要求以数组的形式传入参数

调用上下文 指向全局变量  指向方法所属的对象 指向新创建的对象 允许显示的指定调用所需的this值,为call()或apply()中的第一个参数
返回值
I. 没有执行到return语句,返回undefined

II. 执行到return xxx语句,返回return之后的值

III. retrun后没有值,返回undefined

 与函数调用模式一致
构造函数通常不使用return关键字,返回值就是新对象。

如果构造函数显示地使用return语句返回一个对象,那么调用表达式值就为这个对象。

如果构造函数使用return语句但没有指定返回值或者返回一个原始值,则忽略返回值,同时使用新对象作为调用结果。

 
时间: 2024-10-27 05:29:08

函数调用的四种方式的相关文章

js种函数调用的四种方式

函数调用 this指向:window 返回值  :由return值决定,如果没有return语句就表示没有返回值 案例1: function f1() { console.log(this); } f1(); //window 案例2: function f2() { return function () { console.log(this); } } var f2n = f2(); f2n(); //this-->window 这也是一次函数调用模式 案例3: functioon f3()

关于this绑定的四种方式

一.前言 我们每天都在书写着有关于this的javascript代码,似懂非懂地在用着.前阵子在看了<你不知道的JavaScript上卷>之后,也算是被扫盲了一边关于this绑定的四种方式. 二.绑定规则 关于this应用的是哪条规则,得先找到调用的位置,再判断应用了哪条规则. 1.默认绑定 先上代码: var a = 2; function foo() { console.log(this.a); } foo(); // 结果:2 先来分析下上面的代码声明, 首先我们在全局作用域中定义了一个

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

JAVA中集合输出的四种方式

在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public static void main(String[] args) throws Exception { Set<Person> javaProgramers = new HashSet<Person>(); javaProgramers.add(new Person("aaron&qu

struts2访问国际化消息的四种方式

Struts2的国际化是建立在java国际化的基础之上的,因此具有强大的国际互能力.Struts2运行时自动检测当前的 Location,然后使用RsourceBundle加载对应的Locale资源文件.因为Struts2对java的国际化进行了封装,因此国际化起来更简单,用户一般提供不同国家的消息资源即可.在Struts2的国际化包含三个部分:前台的国际化,Action中的国际化,验证配置文件的国际化. 在Struts2中加载全局资源文件 国际化的前提是如何让Struts2能够加载到国际化消息

Android中多线程的使用四种方式最全总结

当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest.xml中的代码块(<activity><service><provider><receiver>)中的android:process属性指定其运行在不同的process中.当一个组件在启动的

jQuery绑定事件的四种方式:bind、live、delegate、on

1.jQuery操作DOM元素的绑定事件的四种方式 jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off. 2.必备的基础知识: DOM树 示例,这是在browser环境下的一棵模拟DOM树: 我们的页面可以理解为一棵DOM树,当我们在叶子结点上做什么事情的时候(如click一个a元素),如果我们没有人为的设置stopPropagation(Moder Browser), cancel

jQuery绑定事件的四种方式

jQuery绑定事件的四种方式 jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪些. jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off.在开始看他们之前 一:bind(type,[data],function(eventObject

实例化类的四种方式

实例化类有四种方式: 1)使用new操作符 2)调用Class对象的newInstance()方法 3)调用clone()方法,对现有实例的拷贝 4)通过ObjectInputStream的readObject()方法反序列化类 1.new操作符 A a1 = new A(); System.out.println("a1: " + a1); 2.Class.forName()的newInstance方法和Constructor对象的newInstance()方法 Class<A