js函数调用模式

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

2、方法调用模式
示例如下:

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

3、函数调用模式
示例如下:

1 var name = "zhangsan";//aa变量加载到了window对象上
2    function test(){
3       function test1(){
4          document.write(this.name);//zhangsan,this为window对象
5    };
6    test1();
7 }
8 test();
当函数以此模式调用时,this被绑定到全局对象。这是语言设计的一个错误。倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。幸运的是,有一个很容易的解决方案:如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this,按照约定,我给那个变量命令为that:

 1 //目的:使用add方法对数值进行相加
 2 //给myObject增加一个double方法。
 3 myObject.double = function(){
 4    var that = this;//解决方法
 5    var helper = function(){
 6       that.value = add(that.value,that.value);//add方法为两数字相加
 7    };
 8    helper();//以函数的形式调用helper
 9 };
10 //以方法模式调用double
11 myObject.double();
12 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

this被绑定到构造函数的prototype属性上(即被绑定到对象的原型链上),见谷歌浏览器debug模式显示的对象内部结构:



5、Apply调用模式
apply方法(call方法类似)让我们构建一个参数数组并用其去调用函数。它也允许我们选择this的值。
apply方法接受两个参数,第一个是将被绑定给this的值,第二个就是一个参数数组。
示例如下:

1 var myStatus = {
2    status:‘A-OK‘
3 };
4 //myStatus并没有继承自Ouo.prototype。但我们可以在myStatus上调用get_status方法,尽管myStatus并没有一个名为get_status的方法
5 var st = Quo.prototype.get_status.apply(myStatus);//A-OK
6 var st1 = myQuo.get_status.apply(myStatus);//A-OK
时间: 2024-10-11 17:33:36

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

js 四种函数调用模式

看js语言精粹,还在慢慢啃,啃到了一些之前没想到过的就在博客上记录一下吧.号外一下,工作室的汉子有时候太他妈没有节操了!!你们没节操就算了,当着我的面,这都什么鬼(崩溃中),不说这些没用的,进入正题吧. 调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数.那么新函数会有哪些个参数呢,这就涉及到上节闭包里讲到的活动对象了,每个函数除了声明时定义的形参,还有两个this,arguments.this是个灰常重要的参数咯,它的值取决于调用的模式.在js中一共有4中调用模式:方法调用模式,函数调

js中的4种函数调用模式

javascript一共有4种调用模式:函数调用模式.方法调用模式.构造器调用模式和间接调用模式. [1]函数调用模式 当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用的.对于普通的函数调用来说,函数的返回值就是调用表达式的值 function add(x,y){ return x+y; } var sum = add(3,4); console.log(sum)//7 使用函数调用模式调用函数时,非严格模式下,this被绑定到全局对象:在严格模式下,this是undefined

JS函数调用的四种方法

js的函数调用会免费奉送两个而外的参数就是 this 和 arguments .arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度. 书上有说4中调用方式: 方法调用模式 函数调用模式 构造器调用模式 apply调用模式 下面我们来看看一些实例更好理解. 1:方法调用模式. 请注意this此时指向myobject. /*方法调用模式*/    var myobject={            value:0,            inc:functio

js函数调用的方法:

js的函数调用会免费奉送两个而外的参数就是 this 和 arguments .arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度. 书上有说4中调用方式: 方法调用模式 函数调用模式 构造器调用模式 apply调用模式 下面我们来看看一些实例更好理解. 1:方法调用模式. 请注意this此时指向myobject. /*方法调用模式*/    var myobject={            value:0,            inc:functio

JS函数调用的方法

JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式:先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来执行方法,this即指当前的myobject 对象.var blogInfo={ blogId:123, blogName:"werwr", showBlog:function(){alert(this.blogId);}}; blogInfo.showBlog(); 2.函数调用模式定义

javascript this 关键字以及四种函数调用模式

最近在学习javascript ,被js中的this关键字搞得晕头转向,都不知道这个东西到底是干什么的,不同的地方所指的对象又不一样.在查询了很多的资料以后,终于有了一些眉目了. this的定义:在javascript中,上下文对象就是this指针,即被调用函数所处的环境,上下文对象的作用是一个函数内部引用调用它的对象本身. 上面就是javascript中this关键字的定义,单纯的理解来说还是很好理解的,但是真正到用的时候发现又是另外一回事了. 说到this的用法,就要谈到到this的作用域,

JavaScript函数调用模式

1.方法调用模式: var myObj = { value : 0; increment:function(inc){ this.value += typeof inc === 'number' ? inc : 1; } } myObj.increment(); console.info(myObj.value); // 1 2.函数调用模式: 当一个函数并非一个对象的属性时,那么它被当做一个函数来使用,这时 this 被绑定到全局对象,要解决这个问题,需要在内部重新命名一个变量.获取内部函数的

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

这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象.如果调用表达式包含一个提取属性的动作(a.name或a[name]),那么他就是被当做一个方法调用. 1 var myObject = { 2 value:1, 3 double:function(){ //double是myObject对象的一个方法 4

JS 函数调用

Js函数调用的方式有如下几种情况: 1 (1)具名函数直接调用 2 function foo() 3 { 4 } 5 foo(); 6 7 (2)匿名函数通过引用来调用 8 fooRef = function() 9 { 10 11 } 12 fooRef(); 13 14 (3)没有引用的匿名函数调用1 15 (function() 16 { 17 18 }()); 19 20 (4)没有引用的匿名函数调用2 21 (function() 22 { 23 24 })(); 25 26 (5)没