1、函数调用
调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组,它拥有length属性,但它缺少数组的所有方法)。参数this在面向对象编程中非常重要,它的值取决于调用的模式。在js中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this上存在差异。arguments的个数取决于函数定义时候形参的个数,如果调用函数时,传递的形参与函数定义的参数个数不匹配不会导致运行错误,调用时传递的参数过多,超出的参数会被忽略,如果过少,缺失的值被undefined代替。

2、方法调用模式
 var myObj = {
value:0,
increment:function(val){
this.value += typeof val ==="number" ? val : 1;//this为myObj对象
}
};
myObj.increment();
document.write(myObj.value);//
myObj.increment(2);
document.write(myObj.value);//
   方法可以使用this去访问,所以它能从对象取值或修改该对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。

3、函数调用模式

 var name = "zhangsan";//aa变量加载到了window对象上
function test(){
function test1(){
document.write(this.name);//zhangsan,this为window对象
};
test1();
}
test(); 

当函数以此模式调用时,this被绑定到全局对象。这是语言设计的一个错误。倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。幸运的是,有一个很容易的解决方案:如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this,按照约定,我给那个变量命令为that

 //目的:使用add方法对数值进行相加
//给myObject增加一个double方法。
myObject.double = function(){
var that = this;//解决方法
var helper = function(){
that.value = add(that.value,that.value);//add方法为两数字相加
};
helper();//以函数的形式调用helper
};
//以方法模式调用double
myObject.double();
document.write(myObject.getValue());//6,这样helper方法可以使用this

4、构造器调用模式

对象实例调用原型中的方法时,该方法可以使用this访问其构造函数内的属性或方法。

 //创建一个名为Quo的构造函数,它构造一个带有status属性的对象。
var Quo = function (str,name){
this.status = str;
this.name = name;
};
//给Quo的所有实例提供一个名为get_status的公共方法。
Quo.prototype.get_status = function(){
return this.status;//this能访问到status
};
Object.prototype.get_name = function(){
return this.name;//能访问到name
};
//构造一个Quo实例
var myQuo = new Quo("confused","zhangsan");
//confused,document.write()和document.writeln都是js向客户端写入的方法,writeln是以行方式输出的,但并不是指页面实际效果中的换行,即页面的实际效果是没有换行的。
document.writeln(myQuo.get_status());
document.write(myQuo.get_name());//zhangsan

5、Apply调用模式

apply方法让我们构建一个参数数组并用其去调用函数。它也允许我们选择this的值。
     apply方法接受两个参数,第一个是将被绑定给this的值,第二个就是一个参数数组。

 var myStatus = {
status:'A-OK'
};
//myStatus并没有继承自Ouo.prototype。但我们可以在myStatus上调用get_status方法,尽管myStatus并没有一个名为get_status的方法
var st = Quo.prototype.get_status.apply(myStatus);//A-OK
var st1 = myQuo.get_status.apply(myStatus);//A-OK

js函数调用模式的更多相关文章

  1. js函数调用模式总结

    在javascript中一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式和apply调用模式.这些模式在如何初始化关键参数this上存在差异 方法调用模式 当一个函数被保存为对象的一个属 ...

  2. JS函数调用的方法

    JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式:先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来 ...

  3. JS调用模式

    在js中,一共4中调用方式.需要注意的是,调用方式中,this的指向问题. 函数调用模式 this丢失,debug会提示未定义相应属性.按照规范,需要将this赋值给that let myObj = ...

  4. JS函数调用的四种方法

    js的函数调用会免费奉送两个而外的参数就是 this 和 arguments .arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度. 书上有说4中调用方式: 方 ...

  5. js函数调用的几种方法

    js的函数调用会免费奉送两个而外的参数就是 this 和 arguments .arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度. 书上有说4中调用方式: 方 ...

  6. js严格模式“use strict”

    js的严格模式会放弃js中的一些不正规的写法,参考 http://www.cnblogs.com/God-Shell/p/3139329.html: 使用声明"use  strict&quo ...

  7. JS 函数调用

    Js函数调用的方式有如下几种情况: (1)具名函数直接调用 function foo() { } foo(); (2)匿名函数通过引用来调用 fooRef = function() { } fooRe ...

  8. JavaScript 方法调用模式和函数调用模式

    这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为 ...

  9. js调试模式控制台输出信息

    js调试模式控制台输出信息.console.log

随机推荐

  1. 源码解读—HashTable

    在上一篇学习过HashMap(源码解读—HashMap)之后对hashTable也产生了兴趣,随即便把hashTable的源码看了一下.和hashMap类似,但是也有不同之处. public clas ...

  2. js实现基础运动

    首先我定义3个div每个div当我鼠标放上去的时候,他的宽度就表达,如下图 首先是样式和html代码 <style> div{ width:100px; height:50px; back ...

  3. bash操作小结

    刚开始学写bash脚本,发现有很多需要注意的细节问题,在这里记录一下便于记忆: 1. help test  帮助 2. bash提供的数组数据结构,它是以数字为下标的,和C语言从0开始的下一样  参考 ...

  4. 使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  5. python基础05 缩进与选择

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...

  6. display:none与visibility: hidden的区别

    display:none和visibility: hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失. ...

  7. 使用DotNetOpenAuth搭建OAuth2.0授权框架

    标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...

  8. MSBuild简单介绍

    背景 托博客园的福,上周六,有家开发医疗行业系统的初创公司联系我,说在博客园上看到我关于WPF的几篇文章,邀请我去他们那里交流WPF相关的技术知识和心得体会.作为非大拿的我自然是受宠若惊,但对方好意相 ...

  9. $.when().then()

    当两个Ajax请求是成功的则执行函数myFunc,如果任一个有错误则执行myFailure. $.when($.ajax("/page1.php"), $.ajax("/ ...

  10. 使用虚幻引擎中的C++导论(一-生成C++类)

    使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...