博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
this与JavaScrip中的四种调用模式
阅读量:7219 次
发布时间:2019-06-29

本文共 1789 字,大约阅读时间需要 5 分钟。

this是什么

—大多语言中,’this’代表由类实例化的当前对象。在JavaScript中,’this’通常表示’拥有’方法的对象,但具体取决于一个函数被调用的方式。

方法调用模式

当一个函数被保存为对象的一个属性并调用该方法时,this被绑定至该对象。即使用”obj.method”形式

1 2 3 4 5 6 7 8
var val = "outer"; var methodCall = {
val: "inner", printVal: function(){ console.log(this.val); } } methodCall.printVal(); //"inner"

 

构造器调用模式

类似面向对象语言中对象的概念,使用new后,this被绑定至该实例。

1 2 3 4 5 6 7 8 9 10 11
var val = "outer"; function methodCall(){ this.val = "inner"; } methodCall.prototype = { printVal: function(){ console.log(this.val); } } var a = new methodCall(); a.printVal(); //"inner"

 

函数调用模式

函数未作为对象的属性时,其当作一个正常函数来调用,此时this被绑定至全局对象。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
var val = "outer"; function methodCall(){ this.val = "inner"; } methodCall.prototype = { printVal: function(){ var that = this; var innerPrintVal = function(){ console.log(that.val); console.log(this.val) } innerPrintVal(); } } var a = new methodCall(); a.printVal();

 

打印结果为

1 2
inner outer

 

  • a.printVal调用printVal的方式为构造器调用模式,这时的this被绑定到a的作用域。将其赋给that,此时that就代表了a的作用域。
  • a.printVal调用innerPrintVal的方式为函数调用模式,这时的this被绑定到全局作用域。

注意,在a.printVal中,this是被绑定在a的作用域上的。但是在调用innerPrintVal时,this在该函数中被再一次绑定到全局作用域了。因此在innerPrintVal中调用console.log(this.val)打印的结果为”outer”

apply/call模式

手动指定this的值

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
var val = "outer"; function printVal(){ console.log(this.val); } function methodCall(){ this.val = "inner"; } methodCall.prototype = { printVal: function(){ console.log(this.val); } } var a = new methodCall(); a.printVal(); //"inner" a.printVal.call(a); //"inner" printVal.call(a); //"inner" printVal(); //"outer" printVal.apply(window); //"outer" a.printVal.apply(window); //"outer"

 

输出结果为:

1 2 3 4 5 6
inner inner inner outer outer outer

 

可以看出,无论是采用构造器调用模式的a.printVal或是采用函数调用模式的printVal,this均会被apply/call绑定为手动指定的值

转载地址:http://eoqym.baihongyu.com/

你可能感兴趣的文章
android View 1
查看>>
Zabbix 监控windows的网卡流量
查看>>
Oracle 查询当前系统时间的几种方式
查看>>
python 爬虫系列(1) --- requests库入门
查看>>
使用Apache Httpclient访问Spring rest接口下载文件
查看>>
机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)
查看>>
Dockerfile多阶段构建
查看>>
MySQL配置文件mysql.ini参数详解
查看>>
通知UI thread的一个方法
查看>>
offsetof宏—求结构体中一个成员在该结构体中的偏移量
查看>>
SpringMVC+hibernate+mysql环境搭建后测试例中使用的注解总结
查看>>
C++ Primer(第五版)练习12.6
查看>>
debian 声音管理
查看>>
高级计划任务维护管理
查看>>
关于GCD一些事
查看>>
iOS 全面支持 webp格式图片
查看>>
ionic 延时执行
查看>>
addChildViewController 的使用
查看>>
ORA-12560: TNS:protocol adapter error(TNS:协议适配器...
查看>>
vcf2iPhone
查看>>