美文网首页
JS函数调用

JS函数调用

作者: 梦想怪 | 来源:发表于2016-12-09 17:07 被阅读0次

js 里函数调用有4种模式:方法调用、正常函数调用、构造器函数调用、apply/call 调用。
无论哪种函数调用除了你声明时定义的形参外,还会自动添加2个形参,分别是 this 和 arguments,this 的值,在上面4中调用模式下,分别会绑定不同的值。

1.方法调用

var person = {
  age : 18,
  setAge: function(age) {
  this.age= age;
  }
}
person.setAge(16);
alert(person.age);

上面函数this绑定的就是对象person,所以alert出来是16。

2、正常函数调用

function f(age) {
  this.age = age;
}
f(5);

上面这个this绑定的是全局对象,如果是在浏览器运行的解释器中,一般来说是 window 对象。所以这里 this.age 访问的其实是 window.age ,当然,如果 window 没有 age 属性,那么你这么一写,按照 js 的坑爹语法,就是给 window 对象添加了一个 age 属性,同时赋值。

3、构造器函数调用:

js 里最坑爹的部分,如果你在一个函数前面带上 new 关键字来调用,那么 js 会创建一个 prototype 属性是此函数的一个新对象,同时在调用这个函数的时候,把 this 绑定到这个新对象上。当然 new 关键字也会改变 return 语句的行为。看代码

function a(xx){
  this.m = xx;
}
var b = new a(5);

这种方式其实很危险,因为光看函数,你不会知道这个函数到底是准备拿来当构造函数用的,还是一般函数用的.

4、apply/call 调用:

我们知道,在 js 里,函数其实也是一个对象,那么函数自然也可以拥有它自己的方法,有点绕,就好像函数可以自己有属性也是一个函数。其中每个函数都拥有 apply() 这个方法,让我们构造一个参数数组传递给函数,同时可以自己来设置 this 的值,这就是它最强大的地方,上面的3种函数调用方法,你可以看到,this 都是自动绑定的,没办法由你来设,当你想设的时候,就可以用 apply() 了。apply 接收2个参数,第一个是将传递给这个函数的 this 的值,第二个是参数数组。看代码:

function a(xx) {
  this.b = xx;
}
varo = {};
a.apply(o, [5]);
alert(a.b); // undefined
alert(o.b); // 5

是不是很神奇,函数 a 居然可以给 o 加属性值。当然,如果你 apply 的第一个参数传递 null,那么在函数 a 里面 this 指针依然会绑定全局对象。你可能要问了,apply 函数是哪来的,因为在 js 里所有的函数都有一个共同的 prototype,也就是传说中的 Function.prototype, 这个原型里有两个神奇的方法,一个就是这里的 apply ,另一个就是让题主疑惑的 call。说了这么一大堆,终于来到 call 了。call() 方法和 apply() 方法很类似,它们的存在都是为了改变 this 的绑定,那 call() 和 apply() 有什么区别呢?就我个人看来,没啥鸟区别。。。开玩笑!刚刚说了,上面 apply() 接收两个参数,第一个是你想要 this 绑定的对象,第二个是一个参数数组,注意是一个数组,你想传递给这个函数的所有内容都放在数组里,然后 apply() 函数会在传递形参时自动帮你展开,同时加入我上面提到的另一个神奇形参 arguments。而 call() 呢,它的第一个参数也是你想要 this 绑定的对象,但是后面可以接受不定参数,而不再是一个数组,也就是你可以像平时给函数传参那样把这些参数一个一个传递,当然,神奇形参 arguments 还是不会少的。所以如果一定要说有什么区别的话,看起来是这样的

function a(xx, yy) {
  alert(xx, yy);
  alert(this);
  alert(arguments);
}
a.apply(null, [5, 55]);
a.call(null, 5, 55);

仅此而已。

相关文章

  • JS函数调用

    js 里函数调用有4种模式:方法调用、正常函数调用、构造器函数调用、apply/call 调用。无论哪种函数调用除...

  • js里函数调用的四种模式

    js 里函数调用有4种模式:方法调用、正常函数调用、构造器函数调用、apply/call调用。同时,无论哪种函数调...

  • JavaScript 05 函数

    js函数的概念和作用,js函数的定义,js函数的调用,js事件驱动的概念,js函数的实参和形参,js的作用域,js...

  • 【转】this 的值到底是什么?一次说清楚

    你可能遇到过这样的 JS 面试题: 函数调用首先需要从函数的调用开始讲起。 JS(ES5)里面有三种函数调用形式:...

  • JS中this关键字详解

    1、JS中函数的几种调用方式 (1)普通函数调用(2)作为对象方法调用(3)作为构造函数调用(4)apply/ca...

  • JS全年日历打印

    用函数打印全年日历,封装函数然后调用。 js

  • 2018-12-18

    iOS WKWebView 中native调用js, js调用native native设js比较简单,一行函数即...

  • UIWebView(OC)与JS(JavaScript)交互

    获取UIWebView的JSContext Native调用JS函数 多种方式: JS调用Native方法 放出d...

  • android h5 js 匿名函数通信

    android js 互相调用 支持js匿名函数接收 支持js json对象接收 支持js函数返回值获取 通过注解...

  • JS this指向

    一、js中的四种调用模式s 构造函数调用:new Foo(); 对象方法调用:o.method(); 函数直接调用...

网友评论

      本文标题:JS函数调用

      本文链接:https://www.haomeiwen.com/subject/rvxsmttx.html