前面:

前面虽然综合了网络上不少大牛的心得,但感觉还是意犹未尽,为了彻底搞清楚js中this的相关知识,决定再写一篇。个人觉得,在技术上,除非钻到细枝末节,否则很难达至非常高的水平。

补充1:

无法重写this,因为它是一个关键字。

补充2:

pasting

$(function () {
$('button').click(function () {
alert(this);//this 表示原生的DOM
$(this);//表示当前对象,这里指的是button
})
})
this,表示当前的上下文对象是一个html DOM对象,可以调用html对象所拥有的属性,方法。

$(this),代表的上下文对象是一个jquery的上下文对象,可以调用jquery的方法和属性值。

补充3:

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象,这句话有些问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的。

看看2段代码:

code1:
var o = {
name : "江太公";
fn : function(){
console.log(this.name);
}
}
o.fn(); // 江太公
window.o.fn(); //江太公 code2:
var o = {
name : "江太公",
fn : function(){
return (function(){console.log(this.name);})()
}
}
o.fn(); //全局,打印出window的name属性值 code3:
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn(); code3:
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();

code1中window.o.fn并未打印出如code2的结果,this还是指向o了。(以下结论copy至《彻底理解js中this的指向,不必硬背。》)

情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。

情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象,例子3可以证明,如果不相信,那么接下来我们继续看几个例子。当code2中的a:12注释掉后,打印结果为undefined,也即它的调用对象是没有a这个属性的,因此为未定义。

情况4:this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,code3中虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window,这和code2是不一样的,code2是直接执行了fn。

补充4:

alert也是window的一个属性,也是window点出来的。比如在window环境中执行alert(this),结果是:

[object Window]

补充5:

new关键字可以改变this的指向,将这个this指向实例化的对象。创建一个实例相当于复制了一份构造函数到对象里面,此时仅仅只是创建,并没有执行,而调用这个函数的是实例化对象,那么this指向的自然是对象。为什么this会指向实例对象?首先new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。

补充6:

function fn()
{
this.user = "追梦子";
return {};
}
var a = new fn;
console.log(a.user); function fn1()
{
this.user = "江太公";
return function(){};
}
var a1 = new fn1;
console.log(a1.user); function fn2()
{
this.user = "江天SEO";
return 1;
}
var a2 = new fn2;
console.log(a2.user); function fn3()
{
this.user = "江天SEM";
return undefined;
}
var a3 = new fn3;
console.log(a3.user);
function fn()
{
this.user = '追梦子';
return null;
}
var a = new fn;
console.log(a.user); //追梦子

结论是return后如果是对象,this会指向那个对象,如果不是还是实例本身。尽管null也是对象,但它比较特殊,还是指向实例本身。

补充7:

在严格版中的默认的this不再是window,而是undefined。

最新文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之一
  2. Blender 脚本之 Operator 初探
  3. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
  4. Eclipse FreeMarker 插件安装
  5. js的几种排序
  6. 李洪强iOS经典面试题133--UNIX常用命令
  7. 【jmeter】逻辑控制器
  8. SAR命令
  9. HTTP常见错误 400/401/403/404/500及更多
  10. Android Http Server
  11. SQL Server与Oracle对比学习:表的管理和组织
  12. NYOJ 71 独木舟上的旅行(贪心)
  13. DOM操作基本用法
  14. 【A tour of go】练习题
  15. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-3禁止交换和禁用大页面
  16. POJ2484
  17. Springboot学习07-数据源Druid
  18. 数组排列组合问题——BACKTRACKING
  19. dedecms前端无法调用自定义变量怎么解决
  20. facebook api call——error

热门文章

  1. Java全角、半角字符的关系以及转换
  2. windows7命令帮助大全
  3. linux下操作问题与总结
  4. Eclipse Maven Spring MyBatis 配置
  5. JAVA调用R
  6. .NET Core 2.0版本预计于2017年春季发布
  7. window环境下将solr6.3部署到tomcat中
  8. android 自定义控件——(五)按钮点击变色
  9. RadioButton与CheckBox
  10. Android开发案例 - 注册登录