js中,一共4中调用方式。需要注意的是,调用方式中,this的指向问题。

函数调用模式

this丢失,debug会提示未定义相应属性。按照规范,需要将this赋值给that

let myObj = {
value : 1,
double : function(){
let that = this
let _ = function (){
that.value = that.value *2
// this.value = this.value *2 // 内部函数的this被绑定错误值
}
_() // 函数调用模式
}
} myObj.double() // 方法调用模式
console.log(myObj.value) // 输出2

方法调用模式

函数调用模式中的myObj.double()就是方法调用模式,这时,这个函数被保存为对象的一个属性

构造器调用模式

通过new来声明,this会被绑定到一个连接prototype的新对象。结合原型链,可以实现很多有趣用法。

function Myobj(value){ // 注意命名规范
this.value = value
} Myobj.prototype.getValue = function(){
return this.value
} let myobj = new Myobj(1) // 构造器调用
console.log(myobj.getValue())

apply调用模式

apply:为了动态改变this而出现。结合闭包,可以更方便的实现原型继承

基于上面的例子,我们首先将getValue方法放入单独的文件./util.js下。

./util.js

exports =  module.exports = function getValue(arg){
return `${this.value} \n我是参数:${arg} `
}

然后再在需要的文件中引入:

'use strict'
function Myobj(value){
this.value = value
}
Myobj.prototype.getValue = function(arg){
return require('./util').apply(this,[arg]) // apply调用模式
} let myobj = new Myobj(1)
console.log(myobj.getValue(-1))

如此,优美地实现了组件化,代码逻辑和架构变得更加清晰。

关于applycall

相同点:

  • 作用一样:动态改变this

不同点:

  • apply调用方式:func.apply(obj,[arg1,arg2,...]),接受数组参数
  • call调用方式:func.call(obj,arg1,arg2,...),接受连续参数

欢迎技术交流,引用请注明出处。

个人网站:董沅鑫的个人网站

Github:godbmw

JS调用模式的更多相关文章

  1. js 函数的调用模式

    1.函数调用 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数.除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组, ...

  2. JS函数的四种调用模式

    函数在js中具有四种身份,分别为函数.方法.构造函数.apply或call调用 函数调用    函数调用模式中this指全局对象(window) var f1 = function() { alert ...

  3. js函数之四大调用模式

    一.方法调用模式 当一个函数调用保存为一个对象的属性时我们称之为方法调用. var myObject = { value:0, increment:function(inc){ this.value ...

  4. JS面向对象函数的四种调用模式

    函数的四种调用模式 概念 在 js 中,无论是函数, 还是方法, 还是事件, 还是构造器,...这些东西的本质都是函数 函数, 方法, 事件, 构造器,...只是所处的位置不同 这四种模式分别是 函数 ...

  5. JavaScript (JS) 函数补充 (含arguments、eval()、四种调用模式)

    1. 程序异常 ① try-catch语法    测试异常 try-catch语法代码如下: try { 异常代码;     try中可以承重异常代码, console.log(“try”)  出现异 ...

  6. js中this的四种调用模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. js高级-函数的四种调用模式

    1.对象方法调用模式  方法内部的this指向当前调用者的对象d 定义类 (构造函数) function Dog (dogName){ //创建一个空对象   让空对象==this this.name ...

  8. JS高级——函数的调用模式

    函数调用模式一共有四种 <script> //1.函数模式 //this指向window全局对象 //2.方法模式 //this指向调用这个方法的对象 //3.构造函数模式 //this ...

  9. js函数调用模式

    1.函数调用 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数.除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组, ...

随机推荐

  1. 51nod1683

    代码参考:http://blog.csdn.net/sdfzyhx/article/details/74359927 //dp[i][j][k]表示到了第i列,最下边的点最短路为j,剩下的点之间的关系 ...

  2. org.apache.subversion.javahl.ClientException: Previous operation has not finished

    1.问题 eclipse使用SVN出现异常: org.apache.subversion.javahl.ClientException: Previous operation has not fini ...

  3. Word中带圈数字

    写论文时常常要求输入带圈数字,先在Word中输入代码,选中代码后按Alt+X(然后再粘贴到Excel中) 符号 代码⓪ 24ea① 2460② 2461③ 2462④ 2463⑤ 2464⑥ 2465 ...

  4. vs2015 打开项目自动运行 npm install

    问题:VS2015(visual studio 2015) 打开项目自动运行  npm install 解决办法: 打开工具-选项-项目与解决方案--外部web工具   去掉npm勾选 还有如果文件g ...

  5. WebRTC 学习之 Conference 实现混音混屏

    混音 混音的意义就是将多个音频流混成一路音频,在Conference 的实现中有分为终端实现和服务器实现. 1. 终端混音实现: 终端接受到多路(一般是多个用户)的音频流之后,在终端本地将多路音频流混 ...

  6. 3.复杂的viewpager

    实现这样的效果: 1.主页面布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo ...

  7. Jedis 操作 Redis 工具类

    配置类 pom.xml pom.xml 里配置依赖 <dependency> <groupId>redis.clients</groupId> <artifa ...

  8. 第二十节:详细讲解String和StringBuffer和StringBuilder的使用

    前言 在 Java中的字符串属于对象,那么Java 中提供了 String 类来创建和操作字符串,即是使用对象:因为String类修饰的字符一旦被创建就不可改变,所以当对字符串进行修改的时候,需要使用 ...

  9. Swift5 语言指南(九) 闭包

    闭包是自包含的功能块,可以在代码中传递和使用.Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas. 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用 ...

  10. MySQL mysqlbinlog 访问mysql-bin日志出错

    问题 mysqlbinlog -v -v --base64-output=DECODE-ROWS mysql-bin.000166 | less ERROR: Error in Log_event:: ...