常见面试题JS语言中四种函数调用方式实例讲解

techbrood 发表于 2017-01-04 13:00:55

标签: javascript, function, 基础知识, 面试题, bind, apply, call

- +

JS的语言世界中函数(function)是一等公民,函数的调用有多种方法。

普通调用

这个是最常见和直接的方式:

function f(x) {        
    console.log(x*x);
}
f(5); // 25

方法调用

函数被定义为对象的方法,以对象方法的形式调用,如下:

var c = {    
    v : 0,    
    f : function(x) {                
        this.v = x;    
    }
}
c.f(5);

构造器调用

和C++/Java等语言类似,当使用new操作符来创建一个对象实例时,将自动调用其构造函数:

function c(x) {        
    this.m = x;
}
var inst = new c(5);

其详细过程为1.创建一个对象 2.把函数作用域赋予该对象(即赋值this)3.调用函数体代码 4.返回对象

call/apply/bind调用

在JS中,每个自定义函数(甚至原生类型)都有一个原型(prototype)对象,该原型对象内置实现了call、appy、bind函数,

call和apply很相近,都是用来改变this,我们知道this默认指向调用者对象,通过call/apply可以改变这种默认行为。

apply() 接收两个参数,第一个用来绑定this,第二个是参数数组,你想传递给这个函数的所有参数都放在数组里,然后apply()函数会在调用函数时自动帮你把数组展开。call()的第一个参数也是用来绑定this,但是后面接受的是不定参数,而不是一个数组,代码示范如下:

function c(x, y) {    
    console.log(x+y);    
    console.log(this);
}
c.apply(null, [5, 10]); // 15, window 
c.call(null, 5, 10); // 15, window
var n = c.bind(null, 5, 10); // nothing logged
n(); // 15, window

而bind函数和call函数参数一样,但是bind实际上返回一个新的函数对象,用来延迟调用(不是马上执行)。


另外关于函数调用,我们还需要了解下函数定义方式上的不同:一种是函数声明,一种是函数表达式,

函数声明的一个重要特征是会有函数声明提升(function declaration hoisting),这也是两种声明方式的一个重要区别:

c(5); // 5
function c(x) {// 因为有函数声明提升效应,上面的函数调用是可以工作的。
    console.log(x);
}

反之,如果使用表达式,则必须注意函数调用必须在表达式定义之后:

c(5); // 报错 Uncaught TypeError: c is not a function
var c = function(x) {
    console.log(x);
}

注:上面这种函数表达式中创建的函数function关键字后面没有标识符,被称之为匿名函数(也叫Lamada函数),匿名函数的name属性为空字符串。

possitive(1) views4854 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • 增强现实引擎ARToolKit工作原理简介

    ARToolkit是一个基于CV(计算机视觉)和Marker(标识)的开源增强现实引擎。其具备如下功能特性:A. 鲁棒跟踪,包括基于标记的跟踪与基于特征的跟踪;

  • 谷歌ARCore技术特性简介

    谷歌美国时间2017.8.29号刚发布了ARCore预览版,这是一个类似于苹果ARKit的增强现实SDK,在此之前,谷歌虽然已投资AR平台Tango,但由于需要特定的硬件和传感器,...

  • WebAssembly工作原理和JavaScript语言性能对比分析

    本文简单说明WebAssembly(简称wasm)工作原理和高性能的原由(和JavaScript相比)。不过需要提醒的是Wasm并非设计来完全替代JS,而是对JS的一个强大补充,JS中...

  • React JSX语法简介

    JSX是一种类似XML的标签语法,用来简化代码,我们可以不使用JSX,但了解并使用也没什么坏处:)在React中,JSX是一个使用 React.createElement() API的快捷方式...

  • CSS3人行走动作图解和动画实现

    对于人类而言,行走是一种很自然的想要前进并防止跌倒的一组动作重复。大部分人1岁就学会了走路,但至此以后的几十年间,或许我们从来没留意过自己行走姿势。当...

  • 三维向量的简单运算和实用意义

    在WebGL的实际应用中我们广泛使用向量的几何运算来计算角度、距离,判断点线、点面之间的关系,比如物体之间的碰撞检测。本文简要介绍三维计算机图形学中常用的...

  • WebVR简介和常用资源链接

    什么是WebVR这是一个实验性的JavaScript API,提供了在用户网页浏览器中访问虚拟现实设备的统一接口。当前主流VR设备如Oculus Rift DK2、谷歌的CardBoard、三星...

  • 如何实现SVG clipPath自适应被裁剪对象

    CSS3中引入的clip-path(裁剪路径)属性是一个很强大的特性。
    clip-path的含义如下图所示,好比剪纸一样,你用剪刀沿着某条路径把目标对象(图像或元素)裁...

  • 浏览器控制台报JS脚本执行错误:Module is not defined

    现在JS分成了两个分支,一部分在服务器端发展如NodeJS,一部分是传统的浏览器运行环境。
    有些插件在编写JS代码时,是针对Node编写的,所以直接在浏览器中使...

  • 如何基于Canvas来模拟真实雨景Part2:重力掉落和雨滴融合

  • jQuery Ribbles - 基于WebGL的水面涟漪动效插件

    使用jQuery

  • 如何使用CSS3实现书页(书本)卷角效果

    我们有时候想在页面显示一个公告或用户提示信息。一个常用设计是使用书签形状。我们可以给书签添加卷角效果,以使其更为逼真。所谓的“卷角”实际上可以用小角度...

  • 如何使用纯CSS3实现一个3D泡沫

    要实现一个逼真的泡沫,涉及到比较复杂的光学/物理学知识。我们这里先简化下问题,实现一个相对简单而足够实用的泡沫元素。我们可以把基础的泡沫元素应用在很多场景中,比如水景、泡咖啡、啤酒甚至火焰特效中。泡沫首先是一个圆形元素.bubble

  • 更多...