关于js中this的浅析,大家可以点击【彻底理解js中this的指向,不必硬背】这篇博客了解。

今天遇到2段比较有意思的代码。

----------------第一段--------------------

function a(xx){this.x=xx;return this};
var x=a(5);var y=a(6);
console.log(x.x);
console.log(y.x);

输出:

undefined  //console.log(x.x)
6 //console.log(y.x)

Why?

其实这段代码还是比较有误导性的,我们来简化并且分解一下,简化后如下。

function a(xx){
this.x = xx;
return this;
} var x = a(5);
console.log(x.x);

我们主要分析一下 var x = a(5) 调用a函数时发生了什么。

由于在window层面下,我们可以这样改写这句。

window.x = window.a(5); //这句等同于 var x = a(5);

1、我们先看等号【右侧 var x = a(5)】部分,也就是执行a(5)这个函数的时候发生了什么,因为其在window层面下,你可以理解为 window.a(5),基于javascript中关于this的理解,【谁调用该函数,里面的this指向谁】,

那么在这里,很显然,是window调用了函数a,里面的this当然指向window。

在函数执行时第1句: this.x = xx; //由于传入的值是常数5,那么this.x=5,没有问题吧; ok,进一步,this指向是谁呢,谁调用的该函数,this就是谁,那么在这里显然

是window调用的函数a,那么this指向的就是window,于是我们可以这样写,window.x = 5   请注意,这里很重要,此时此刻window.x=5, 表明window层下面有一个x属性,并且值为常数5;

在函数执行时第2句:return this;  // this同样指向的是window, 所以返回window

a(5)执行完毕,返回window;

2、接着看等号【左侧 var x = a(5)】部分,也就是var x,也就是说我们在window层面下申明一个名为x的变量;  前面第一句【this.x=xx】执行完毕,已经在window下面产生了一个属性x,也就是上面红色部分 window.x

而现在我们又在window层面下申请一个变量x ,显然后面这个申明的x会覆盖掉第一句在【this.x】产生的window.x。

最终:a(5)执行完毕,返回window对象,并赋值给变量x,那么在console.log(x.x) 输出window

问题来了,不是说输出undefined吗?现在我们整段一起看。

function a(xx){
this.x=xx;
return this
}; var x=a(5);
//console.log(x.x) 如果此时我们作输出,没错,得到的就是window。问题在下面这一句
var y=a(6); //调用函数a(6) 会造成 window.x =6 再么接下来再输出console.log(x.x), 由于x=6 ; console.log(6.x)肯定是无效的,因此为undefined
console.log(x.x); // undefined
console.log(y.x); // 6

    

总结:

定义的a方法,直接调用this对象指向的是window全局变量。在x=a(5)时,this.x就是window.x得到的是5,后来x接到了返回值是window.

这一点你可以把y=a(6)注释掉执行看到!然后再调用y=a(6),这时候this.x把之前的x改写成6,成了一个数值型的变量了。

这时候y接到了返回的window,x.x不存在,y.x就是被改写的那个6了!

----------------第二段--------------------

var obj = {
go: function() { console.log(this) }
};
(0 || obj.go)() //这里为什么输出window 啊

分解上面的代码:

obj.go = function() { console.log(this) }

(0 || obj.go)() 这句,我们可以写成 (0 || function() { alert(this) })()

这样看起来就简单多了

( 0 || function() { console.log(this) } )()  自执行函数,我们先看扣号中红色部分,执行后返回什么呢?

大家控制台中可以测试一把,执行后返回函数  function() { alert(this) }

因此代码如下,一个妥妥的自执行函数

(function() { alert(this) })()

谁调用该函数,里面的this指向谁,这里是在最外层执行,也就是window调用了该函数,因此输出window

如何更好的理解js中的this,分享2段有意思的代码的更多相关文章

  1. 更快的理解js中循环嵌套

    [循环控制语句] break语句:终止本层循环,继续执行循环后面的语句:(当循环有多层时,break只会跳出一层循环) continue语句:跳过本次循环,继续执行下次循环: (对于for循环,con ...

  2. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  3. 深入理解JS中的对象(二):new 的工作原理

    目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...

  4. 深入理解Js中的this

    深入理解Js中的this JavaScript作用域为静态作用域static scope,但是在Js中的this却是一个例外,this的指向问题就类似于动态作用域,其并不关心函数和作用域是如何声明以及 ...

  5. 图文结合深入理解 JS 中的 this 值

    图文结合深入理解 JS 中的 this 值 在 JS 中最常见的莫过于函数了,在函数(方法)中 this 的出现频率特别高,那么 this 到底是什么呢,今天就和大家一起学习总结一下 JS 中的 th ...

  6. 深度理解js中var let const 区别

    首先要理解js中作用域的概念 作用域:指的是一个变量的作用范围 1.全局作用域 直接写在script中的js代码,在js中,万物皆对象,都在全局作用域,全局作用域在页面打开时创建,在全局作用域中有一个 ...

  7. 如何理解js中的this和实际应用中需要避开哪些坑

    this是什么 this就是函数内部的关键字 看下面例子理解js中的this // 例子1 function fnOne () { console.log(this) } 'use strict' f ...

  8. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  9. 理解js中的闭包

    闭包 我的理解是 能够有权访问另一个函数作用域中变量的函数 通常我们知道 普通的函数在调用完成之后,活动对象不会从内存中销毁,其执行环境的作用域链会被销毁,造成资源的浪费 而闭包的好处就在于执行完就会 ...

随机推荐

  1. (转) 对svn分支合并类型和深度的理解

    合并的工作是把主干或者分支上合并范围内的所有改动列出,并对比当前工作副本的内容,由合并者手工修改冲突,然后提交到服务器的相应目录里.如果当前工作副本是主干,则合并的范围是分支上的改动,如果工作副本是分 ...

  2. JVM调优- jmap(转)

    http://blog.csdn.net/fenglibing/article/details/6411953 1.介绍 打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些 ...

  3. python 基础 9.9 查询数据

      #/usr/bin/python #-*- coding:utf-8 -*- #@Time   :2017/11/24 4:21 #@Auther :liuzhenchuan #@File   : ...

  4. poj2816

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29799   Accepted: 12090 De ...

  5. 基于镜像安装mysql

    准备目录 cd /opt mkdir -p mysql/data mysql/logs mysql/conf 查找MySql镜像版本 docker search mysql 安装指定版本的mysql镜 ...

  6. web.xml配置中的log4jRefreshInterval

    采用spring框架的项目如何使用log4j在spring中使用log4j,有些方便的地方, 1.动态的改变记录级别和策略,即修改log4j.properties,不需要重启web应用,这需要在web ...

  7. iostat命令简单使用

    1.iostat使用范围 iostat命令可以生成3种类型的报告: (1)CPU使用情况的报告 (2)设备使用情况的报告 (3)网络文件系统(NFS)使用情况的报告 2.每种报告的格式说明 关于CPU ...

  8. bug_1——oracle listagg():列转行

    select    listagg(字段名 ,',') within group (order by 字段名) from表 where 条件 listagg():列转行 WM_CONCAT():和并列 ...

  9. python基础15 ---面像对象的程序设计

    面向对象的程序设计 一.面向对象的程序设计简介 1.面向对象程序设计的由来. 我们之前虽然学习过了面向过程的程序,它的核心是面向过程,一步一步的设计好了的流程,虽然极大的降低了程序的复杂度,但是一个设 ...

  10. 4django模板

    在前面的几节中我们都是用简单的django.http.HttpResponse来把内容显示到网页上,本节将讲解如何使用渲染模板的方法来显示内容 1.创建一个 zqxt_tmpl 项目,和一个 名称为 ...