常见面试题JS语言中四种函数调用方式实例讲解
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属性为空字符串。
最新评论
- 相关文章
OpenGL/WebGL顶点坐标变换过程简介
世界坐标是按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都建立在世界坐标的基础上。对象坐标系对象被应用于任何...
CentOS6 Apache2.2用域名配置多虚拟机
在CentOS下使用域名配置多虚拟机的步骤如下:
1. 使用WebAssembly工作原理和JavaScript语言性能对比分析
本文简单说明WebAssembly(简称wasm)工作原理和高性能的原由(和JavaScript相比)。不过需要提醒的是Wasm并非设计来完全替代JS,而是对JS的一个强大补充,JS中...
WebGL Roadmap
Unity 5.0 shipped with a working preview of our WebGL technology in March this year. Since then, Google has disabled (by default) NPAPI support in the...
常见面试题JavaScript闭包(ES5语法)
JavaScript闭包(Closure)是常见的JS面试题,是否理解闭包是一个简单的区分JS初级和高级程序员的判例。几乎每个JS程序员都在使用闭包,有意或无意间。比如编写一个jQuery鼠标点击处理函数:$(function()
使用HTML5 FileReader和Canvas压缩用户上传的图片
手机用户拍的照片通常会有2M以上,这对服务器带宽产生较大压力。因此在某些应用下(对图片要求不那么高)我们可以在客户端来压缩图片,然后再提交给服务器。总体...
WebGL 纹理映射模式以及WRAP_S | WRAP_T参数详解
我们在纹理滤镜一文中已经说明了2个重要的纹理参数,用来定义对象缩放时纹理的处理方式:GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER本文讲解其余几个纹理参数...
Blender2.7 快捷键一览表
通用操作
停止当前操作:ESC
快捷搜索:SPACE撤销:ctrl+z重做:ctrl+shift+z渲染:F12
单选:鼠标右键(RMB)全选:A
框选:B
刷选:...Three.js入门教程4 - 创建粒子系统动画
嗨,又见面了。这么说我们已经开始学习Three.js了,如果你还没有看过之前三篇教程,建议你先读完。如果你已经读完前面的教程了,你可能会想做一些关于粒子的东西。让我们直面这个话题吧,每个人都爱粒子效果。不管你是否知道,你可以很轻易地创建它们。
WebGL入门教程6 - 光照效果和Phong光照模型
正是因为有了光,世界才能被我们看见,在3D的世界里,光照给物体带来真实的视觉感受。当光照射在某一表面上时,它可能被吸收、反射或投射。其中入射到表面上的一...
如何使用WebGL实现空气高温热变形动画特效
我们在炎炎夏日,或者在火堆旁,经常会观察到热源周围空气的不稳定波动现象。本文将讲解如何通过WebGL来实现这个特效。该效果可用于热变形、波浪、水面波光等场...
WebGL入门教程4 - 使用纹理贴图(Texture Map)
3D建模和纹理贴图的关系就好比人体和皮肤(或着装)的关系,3D建模用来处理空间属性,而贴图适合用来处理细腻的表面属性。如果不使用贴图,而想在表面达到足够的...
WebGL入门教程2 - GPU基本概念和工作流水线(渲染管道)
如何使用CSS3实现书页(书本)卷角效果
我们有时候想在页面显示一个公告或用户提示信息。一个常用设计是使用书签形状。我们可以给书签添加卷角效果,以使其更为逼真。所谓的“卷角”实际上可以用小角度...
更多...