javascript函数的调用模式有哪几种( 二 )


三、构造器调用模式
博主认为构造器调用模式是相对于其他模式来说较为复杂点的调用模式了。通过关键字 new 可以把一个函数作为构造器来调用。关键字 new 可以改变函数的返回值:
.name = foo = func2(\u0026#39;afei\u0026#39;name; bar = func2(\u0026#39;lizefei\u0026#39;bar.name;在上示代码中我们声明了一个函数 func2 ,分别用两种不同的调用模式去调用它。因为函数 func2 并没有显式返回值,所以作为普通函数去调用时,它什么也没有返回,所以 foo 的值是 undefined 。因为普通调用模式的 this 是指向 全局环境 window 的,所以 func2(\u0026#39;afei\u0026#39;); 后,全局环境下就多了一个 name 变量且等于 \u0026#39;afei\u0026#39;。
  func2 作为构造器调用时,我们可以看到,它返回的是一个对象,因为关键字 new 使得函数在调用是发生了如下的特殊变化:
  创建了一个新对象,而且这个新对象是链接到 func2 的 prototype 属性的  把函数里的 this 指向了这个新对象  如果没有显式的返回值,新对象作为构造器func2的返回值进行返回(所以bar 是 {name:\u0026#39;lizefei\u0026#39;})这样子我们就可以看出构造器的作用:通过函数的调用来初始化新创建出来的对象。在JavaScript的面向对象编程里面,这个可是相当重要的。
  因为在函数的声明上,在未来作为构造器调用的函数和普通函数的声明没什么区别,所以导致后来的开发者很容易因为调用模式的错误导致程序出问题。所以开发者们都默契地约定,用来做构造器调用的函数的函数名的第一个字符应该大写,例如:Person,People。这样子后来的开发者一看到函数名就知道要用构造器调用模式调用此函数了。
四、使用apply()和call()方法调用
  这种调用的模式是为了更灵活控制函数运行的上下文环境而诞生的。简单的说就是为了灵活控制函数体内 this 的值。
  apply 和 call这两个方法的第一个参数都是要传递被函数上下文的对象(简单点说就是要绑定给函数 this 的对象)。其他参数就有所不同了:
  apply方法的第二个参数是一个数组,数组里面的值将作为函数调用的参数;
  call方法,从第二个参数起(包括第二个参数),剩下的参数都是作为函数调用的参数;
  让我们看看栗子:
var obj = { name :\u0026#39;afei\u0026#39;}function say(ag1,ag2){ console.log(ag1+\u0026#39;:\u0026#39;+ag2+" "+ this.name);}say.apply(obj,); //apply方法:hello afeisay.call(obj,\u0026#39;call方法\u0026#39;,\u0026#39;hi\u0026#39;); //call方法:hi afei正如栗子所示,我们把对象 obj 作为函数 say 的上下文来调用函数 say ,所以函数里的 this 是指向 对象 obj 的。在apply方法里,我们通过数组 给 say 方法传递了两个参数(\u0026#39;apply方法\u0026#39; 和 \u0026#39;hello\u0026#39;),所以打印出来是: apply方法:hello afei。
  同理 call 也是一样,而且函数传递的方式通过上面的代码也一目了然我,博主就不多做解释了。
  另外,还听说apply和call这两个方法除了传递参数的方式不一样,执行的速度还是apply 比 call 要快呢。不过我就没有实验过。
javascript函数的调用模式有哪几种


■网友
之前有写过类似的文章。大家可以参考。我们说一下,函数调用上下文的模式主要讨论函数有:call、apply、bind;
懒人目录:
从语法上了解三种函数的调用方法上下文调用模式的细节需要注意的地方函数上下文调用模式的使用场景


推荐阅读