this,this,再次讨论javascript中的this,超全面(经典)


Posted in Javascript onJanuary 05, 2016

JavaScript 是一种脚本语言,因此被很多人认为是简单易学的。然而情况恰恰相反,JavaScript 支持函数式编程、闭包、基于原型的继承等高级功能。本文仅采撷其中的一例:JavaScript 中的 this 关键字,深入浅出的分析其在不同情况下的含义,形成这种情况的原因以及 Dojo 等 JavaScript 工具中提供的绑定 this 的方法。可以这样说,正确掌握了 JavaScript 中的 this 关键字,才算迈入了 JavaScript 这门语言的门槛。

 至于js中this这个东西,好多淫解释过了,看起来好高端的样子,不晓得你看懂了木有?

先引用比较高端的,三水点靠木里 的, yes this 

好了,下面加上鄙人比较挫的解释

论点: this 不是变量,不是属性,不能为其赋值,它始终指向调用它的对象

感觉还TM太虚了,只要记住最重要的一条即可 ”它始终指向调用它的对象“ ,所以找到调用this的对象,就知道this到底指向谁了

1、

alert(this);

瞅瞅,弹出来的是么子,要么是”object window“ ,要么 "object" 总之就对象了,是那个对象呢?

alert(this === window);

结果为'true' 所以了,现在调用它的对象是window了

2、

var test = function(){
  alert(this);
}
test();

猜猜上面弹出什么,是不是和"alert(this)" 这句一样的

var test = function(){
  alert(this === window);
 }
test();

运行上面的代码,是不是弹出了'true' ?

事情就这样完了?

要这么简单的话,何必那么多人都去论述这个鸟了?

3、

再来

var test = function(){
  alert(this === window);
 }
new test();

哎哎,这次咋成'false'呢?

记住”this 始终指向调用它的对象“,第”1、“处调用该段代码的直接对象是全局对象,即"window" ;第”2、“处虽然是函数,但是调用其的仍然是”window“(不要弄混了,函数虽然是对象,但是调用它的是另一个对象);第”3、“处,使用了”new“ 这时其实已经发生变化了,这是一个构造函数,构造函数创建时创建了一个新的空的对象,即”new test()“创建了一个新的对象,然后再由这个对象指向函数"test"中的代码,因此此时this不在是window对象,而是该构造函数创建的新对象。

4、

var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
test.b();

有了上面的论点,这下一下子清楚了吧!

5、

var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
var test1 = test;
test1.b();

so, 你不会认为结果为"false"吧,错了,虽然'test1'的值为'test'  但是'test1'不还是'test'对象么,它有新产生对象,你暂且理解为引用的了,两个都指向一个对象,奉上下面一段代码为证

var test ={
  'a':1,
  'b':function(){
   alert(this === test)
  }
 }
var test1 = test;
test.a = 2;
alert(test1.a);

如果弹出了”1“,你来骂我

6、再整个复杂的

var test ={
  'a':1,
  'b':{
   'b1':function(){
    alert(this === test);
   }
  }
 }
test.b.b1();

这是"true"还是"false"呢?

按照上面的理论,这时"this"不再直接被'test'调用了,而是被'test.b' 调用, 奉上下面一段代码为证

var test ={
  'a':1,
  'b':{
   'b1':function(){
    alert(this === test.b);
   }
  }
 }
test.b.b1();

 7、好再整个复杂点的

var test = function(){
  var innerTest = function(){
   alert(this === test);
  }
  innerTest();
 }
test();

你不会认为弹出"true"吧,不是按照上面的理论'innerTest'是被'test'调用的,然后'this'就指向'test'吗?
额,错就错在是谁调用的'innerTest', 其实这种函数都是'window'对象调用的,及时你嵌套一千层,调用各个函数的都是'window'对象,奉上下面这段代码为证

var test = function(){
  var innerTest = function(){
   alert(this === window);
   var innerTest1 = function(){
    alert(this === window);
   }
   innerTest1();
  }
  innerTest();
 }
test();

8、再来一段特殊的

var test = function(){
  alert(this === window);
 }
var test1 = {
}
test.apply(test1);

这个我觉得大家都不会猜错,该函数的作用就是”调用一个对象的一个方法,以另一个对象替换当前对象“ 所以了'window' 对象已经被替代为'test1',自然为'false'了,奉上如下代码以为证明

var test = function(){
  alert(this === test1);
 }
 var test1 = {
  }
test.apply(test1);

 那么诸如'call'之类的也就相似了

9、再来一个原型的继承,区别于字面量的继承

var test = function(){
 }
 var my = function(){
  this.a = function(){
   alert(this === mytest2);
  }
 }
 var mytest = new my();
 test.prototype = mytest;
 var mytest2 = new test();
 mytest2.a();

10、还剩下些什么了,可能就是'dom'对象了

<script>
  var mytest = function(context){
   alert(context.getAttribute('id'));
   alert(this === window);
  }
 </script>
 <div id="test" onclick="mytest(this)">aaaa</div>

看了上面的应该了解了吧,里面的'this'分别代表神马

Javascript 相关文章推荐
jquery tools之tabs 选项卡/页签
Jul 25 Javascript
jQuery创建插件的代码分析
Apr 14 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
全面解析Bootstrap表单使用方法(表单控件)
Nov 24 Javascript
用NODE.JS中的流编写工具是要注意的事项
Mar 01 Javascript
基于JS实现的笛卡尔乘积之商品发布
May 13 Javascript
JavaScript绑定事件监听函数的通用方法
May 14 Javascript
webpack配置文件和常用配置项介绍
Apr 28 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
May 09 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
Jun 28 Javascript
小程序点餐界面添加购物车左右摆动动画
Sep 23 Javascript
基于javascript实现图片预加载
Jan 05 #Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
Jan 05 #Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 #Javascript
javascript简单比较日期大小的方法
Jan 05 #Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
Jan 05 #Javascript
简述jQuery ajax的执行顺序
Jan 05 #Javascript
JavaScript类型系统之正则表达式
Jan 05 #Javascript
You might like
3
2006/10/09 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
Python的净值数据接口调用示例分享
2016/03/15 Python
Python变量和数据类型详解
2017/02/15 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
求职简历中个人的自我评价
2013/12/01 职场文书
《灯光》教学反思
2014/02/08 职场文书
代办委托书怎么写
2014/08/01 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
师德师风事迹材料
2014/12/20 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
pytorch Dropout过拟合的操作
2021/05/27 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python