this在js中是一个特别的关键字,被自动保存在所有函数的作用域中。

为什么要用this

this提供一个对象方式隐式传递一个对象的引用,因此可以将api设计的简洁并且容易复用。看下面两段代码的比较:

function identify() {
return this.name;
}
function speak() {
return "hello,i am " + identify.call(this);
}
var me = {
name:"tony"
};
var you = {
name:"walker"
};
var man = identify.call(you);
console.log(man); //walker
var boy = speak.call(me);
console.log(boy); //tony

this Code

function identify(context) {
return context.name;
}
function speak(context) {
return "hello i am " + identify(context);
}
var me = {
name:"tony"
};
var you = {
name:"walker"
};
console.log(identify(me));
console.log(speak(you));

context Code

this误解

1.this指向函数自身。下面的代码让大家看到this并不像我么所想的那样指向函数本身。

function foo(i) {
console.log("foo: " + i);
this.count++;
}
foo.count = 0;
for(var i =0;i<10;i++){
if(i>5){
foo(i);
}
};
console.log(foo.count); //

js把函数看成一个对象,可以在函数调用时存储状态(属性的值),执行foo.count =0时,的确想函数添加了一个属性count。但是函数内部代码this.count中的this并不指向函数对象。

2.this指向函数的作用域。需要明确的是this在任何情况下都不指向函数的的词法作用域。

function boo() {
var a = 0;
this.bar();
}
function bar() {
console.log(this.a); //a is undefined
}

this到底是什么

this是在运行时绑定的,并不在编写时绑定,它的上下文取决于函数调用时的各种条件。this绑定和函数申明没有关系,只取决于函数的调用方式。当函数被调用时,会创建一个活动记录,这个记录会包含函数在那里被调用(调用栈),调用方式,传参方式等。可以说谁调用this就指向谁。

this实际上是在函数调用的时候发生绑定,它指向什么完全取决于函数在那里被调用。

下一篇文章会详细的说明this

JavaScript中的关于this的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  3. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  4. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  5. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  6. javascript中变量提升的理解

    网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...

  7. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  8. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  9. Javascript中的valueOf与toString

    基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...

  10. 关于javascript中的this关键字

    this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...

随机推荐

  1. Java 基本类型和包装类型

    讲基本类型和包装类型之前,首先要介绍,装箱和拆箱 装箱:基本类型转化为包装类型 拆箱:包装类型转化为拆箱类型 为什么要有包装类型?Java是面向对象的语言,Java中一切都是对象除了基本数据类型,所以 ...

  2. mysql 查看字段是否添加了索引

    show index from 数据库名.表名: 如果是在Navicat这些客户端可以不用写数据库名.

  3. python的arp扫描

    python的arp扫描 from optparse import *from scapy.all import *parser = OptionParser()parser.add_option(& ...

  4. mysql 报错You can't specify target table 'wms_cabinet_form' for update in FROM clause

    这个错误是说从t表select出来的无法又更新t表. 可以在select的时候先取个别名,弄个临时表即可.

  5. [C++]字符串相关操作

    获取字符串长度 String str str.length(); //获取String类型字符串长度 str.size(); //STL获取容器中元素个数 Char* s strlen(s); //以 ...

  6. FortiGate下用户访问特定网址不通

    1.现状: 如图,上网行为管理和防火墙控制用户的数据访问,到外网的出口链路有2条:联通的和电信的,其中联通的优先级较高. 2.现象: 用户访问www.xxxxbbs.com不通 3.分析 在上网行为管 ...

  7. 飞鱼星、H3C企业路由器配置

    飞鱼星企业路由器配置外网访问IIS 只配置端口映射就行,配置好了,如果不立即重启,需要等几分钟才能生效 H3C路由器配置虚拟服务器即可

  8. canvas(五)createPattern

    /** * Created by xianrongbin on 2017/3/9. * 图片填充 */ var dom = document.getElementById('clock'), ctx ...

  9. map与forEach区别

    1.  forEach()返回的是undefined 不可以链式调用 return没有用 2. map()返回一个新数组 原数组不会改 3. 没办法终止或者跳过forEach()和map循环  除非抛 ...

  10. AES-GCM算法

    一.简介 http://blog.csdn.net/t0mato_/article/details/53160772