对于很多初学者,this总是搞得我们晕头转向。

现在,我就简单的总结一下关于this的那点事。

this在函数定义时经常是不能确定的,只有在函数执行的时候才能最终确定this的归属。this总是指向最后调用它的对象,那么怎么知道到底是谁调用的呢?其实很简单,我们知道函数调用的其中一种方法就是利用call.下面就来简单的分析一下怎么利用call来判断调用函数的对象到底是何方神圣。

先来看看call是怎么来使用的:

fun.call(thisArg, arg1, arg2, ...)

  thisArgfun函数运行时指定的this需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

  arg1, arg2, ...指定的参数列表。

知道了call的用法,就可以开始this的分析之旅了。

例子1:

function test() {
var name = 'test';
console.log(this.name); //undefined
}
test();

  test() 等价于 test.call(undefined) ,这时的thisArg为undefined,所以this指向全局对象(浏览器中为window对象),所以this.name为undefined。

例子2:

 var obj = {
name: 'tang',
func: function () {
var name = 'func';
console.log(this.name);
}
};
var test1 = obj.func();//tang
var test2 = obj.func;
obj.func(); //tang
test2(); //undefined

  第8行 test1=obj.func(),赋值时执行函数,obj.func()等价于obj.func.call(obj),thisArg为obj,this指向obj,this.name为tang;

  第10行obj.func() 等价于 obj.func.call(obj) ,这时的thisArg为obj,即this指向obj,所以this.name即为tang;

  第11行test2()等价于test2.call(undefined),所以this指向全局对象(浏览器中是window);

  第8行和第9行的区别在于赋值的时候有没有运行函数,第8行赋值的就运行函数,所以this指向obj,而第9行赋值时没有运行函数,只是把函数赋值给test2,所以this的指向还得等调用函数时才能确定,在第11行调用函数时才能确定。

this的那点事的更多相关文章

  1. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  4. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  5. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  6. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

  9. 使用Bandwagon的VPS第一件事《FQ》

    说点闲话:昨天的长靴子到了,哎呀,今天那个高兴,踩着我的8厘米的过膝靴就出门上专业外语去了,扎了个麻花辫子,那个心情好哟,搞得我都不想继续学习linux平台上的C语言了,好想逛街----秀秀我的鞋子, ...

  10. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

随机推荐

  1. Open Live Writer 代码插入插件测试

    #-*-coding:utf-8-*- import urllib import json import sys import ssl ssl._create_default_https_contex ...

  2. Java socket异常

    Java socket异常 分类: Java 2013-07-15 22:38 981人阅读 评论(0) 收藏 举报 目录(?)[+] 使用Java socket编写程序时,通常会遇到几种种异常:Bi ...

  3. CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集

    Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...

  4. day02-HTML(2)

    一.新知识 1.  !+tab   html5的标签结构   2.  Charset   编码 Ascll Ansi Unicode Gbk Gb2312 Big5 Utf-8   通用字符集 3.关 ...

  5. PHP AES/ECB 128加密

    class Security { public static function encrypt($input, $key) { $key=md5($key.md5($key)); $size = mc ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. 洛谷P1582 倒水

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  8. poj1273 Drainage Ditches (最大流模板)

    http://poj.org/problem?id=1273 Dinic算法 这是一道最大流的经典题 最大流尽量应该用边表,优于邻接矩阵(所以我写了邻接矩阵版的之后又写了个边表) 用了新学的Dinic ...

  9. uoj#228. 基础数据结构练习题(线段树)

    传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...

  10. uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

    传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...