1、this究竟为何物?

1.1 全局上下文(Global context )

在全局运行上下文中(在任何函数体外部),this 指代全局对象window,无论是否在严格模式下。

 alert(this.document === document); // true

 alert(this === window); // true

 this.a = ;
alert(window.a); //

this默认就是指向window对象(window对象大家可以去看下DOM树,它是最顶级的)

1.2 顺便说下JS的"严格模式"和"非严格模式"

进入"严格模式"的标志,是下面这行语句:

"use strict";

详细介绍请看:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

2、函数上下文(Function context )

在函数内部,this的值取决于函数是如何调用的。

2.1 严格模式 和 非严格模式 下直接调用

function f1(){
return this;//非严格模式下
}
alert(f1() == window); // true
function f2(){
"use strict"; // 标记为严格模式
return this;
}
alert(f2() == undefined);//true

2.2 作为对象方法

函数以对象里的方法的方式进行调用时,它们的this由调用该函数的对象进行设置。

下面的例子中,当o.f()被调用时,函数内的this即为o对象。

var o = {
prop: ,
f: function() {
return this.prop;
}
};
alert(o.f()); //

注意,在何处或者如何定义调用函数完全不会影响到this的行为。在上一个例子中,我们在定义o的时候为其成员f定义了一个匿名函数。但是,我们也可以首先定义函数然后再将其附属到o.f。这样做this的行为也一致。

var o = {prop: };
function independent() {
return this.prop;
}
o.f = independent;
alert(o.f()); //

下面的例子:this对象紧邻原则,不去找最大的,去找最近的对象(点前面所有的)

o.b = {g: independent, prop: };
alert(o.b.g()); // 42 此时this不看o对像,而是看0.b对象

2.3 作为一个构造函数

function C(){
this.a = ;
} var o = new C();
alert(o.a); // function C2(){
this.a = ;
return {a:};
} o = new C2();
alert(o.a); //

在最后一个例子(函数C2),因为一个对象在返回期间创建,这个新对象被直接销毁(this.a)

JS的this本质的更多相关文章

  1. js闭包的本质

    js之所以会有闭包,是因为js不同于其他规范的语言,js允许一个函数中再嵌套子函数,正是因为这种允许函数嵌套,导致js出现了所谓闭包. function a(){ function b(){ }; b ...

  2. JS的运行机制

    代码块: JS中的代码块是指由<script>标签分割的代码段.JS是按照代码块来进行编译和执行的,代码块间相互独立(即就算代码块1出错,但不影响代码块2的加载和执行),但变量和方法共享. ...

  3. 个人对JS原型链的一些理解(prototype、__proto__)

    前言 在我一开始学习java web的时候,对JS就一直抱着一种只是简单用用的心态,于是并没有一步一步地去学习,当时认为用法与java类似,但是在实际web项目中使用时却比较麻烦,便直接粗略了解后开始 ...

  4. 云笔记项目-补充JS面向对象编程基础知识

    简单介绍: 此部分知识为在做云笔记项目中补充,因为云笔记项目中涉及到前端js,里面写了很多js脚本,用到了创建js属性和方法,在js中直接声明的属性和方法最终都会变成window的对象,即其成为了全局 ...

  5. App.js实现使用js开发app的应用,此文是中文文档

    在阅读前,在此说明下,本人英文一直不好,所以该文档是借助翻译工具翻译的,阅读起来可能有点不好,请各位谅解,哪位大神有标准的中文文档请分享下 Github下载地址:https://github.com/ ...

  6. js的数组问题

    目录: 1. 遇到的问题 2. 解决方案 3. 内部原理 4. 总结 1. 遇到的问题 前天在写js时,遇到了一个很奇怪的问题:我有两个数组变量a.b,在经过一些运算后,数组b中有一些值,然后我就把数 ...

  7. JS数组遍历方法

    常用数组遍历方法: 1.原始for循环 var a = [1,2,3]; for(var i=0;i<a.length;i++){ console.log(a[i]); //结果依次为1,2,3 ...

  8. WebView全面学习(二)-- Native与js双方通信

    WebView全面学习(二)-- Native与js双方通信 Native与js通信的本质 Native与js通信的核心在于WebView. 两端的通信主要还是单向的.假如要完成js->Nati ...

  9. JS高级(摘自简书)

    JS高级 1. 访问对象属性(方法也是属性)的通用方式:obj['属性名'] 1. 属性名包含特殊字符,如"-".空格,访问:obj['content-type'] 2. 属性名不 ...

随机推荐

  1. LayoutInflater

    Android中LayoutInflater的使用 博客分类: Android   Inflater英文意思是膨胀,在Android中应该是扩展的意思吧. LayoutInflater的作用类似于 f ...

  2. IIS 之 HTTP错误信息提示

    一.HTTP返回码 [1]1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. a. 100 - 继续. b. 101 - 切换协议. [2 ...

  3. Objective-C /iphone开发基础:分类(category,又称类别)

    在c++中我们可以多继承来实现代码复用和封装使程序更加简练.在objective-c中只能单继承,不能多继承,那么除了协议protocol之外,我们可以实现类似多继承的一个方法就是,分类(catego ...

  4. posix thread线程

    1. pthread线程通过调用你提供的某些函数开始.这个“线程函数”应该只有一个void*型参数,并返回系统的类型.2. 通过向pthread_create函数传递线程函数的地址和线程函数调用的参数 ...

  5. /lib /usr/lib /usr/local/lib 的区别

    /lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的. /lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件.目录 /usr/lib/ 中含 ...

  6. nodejs使用express4框架默认app.js配置说明

    var express = require('express'); //引入express模块 var path = require('path'); //引入path模块,该模块包括了一些处理文件路 ...

  7. JAXB - XML Schema Types, Date and Time

    JAXB binds all three of the schema types xsd:date, xsd:time and xsd:dateTime to XMLGregorianCalendar ...

  8. Sql的实际应用

    sql实际应用-递归查询   1.既然要谈到sql,数据库表是必须的   2.数据结构     3.获取某个节点的所有子节点     传统的写法(sql2000) 很麻烦,暂且就不写了     来看看 ...

  9. C++的转换构造函数、拷贝构造函数、赋值运算符重载

    1 转换构造函数     C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...

  10. android开发中R文件丢失

    R文件在android开发中,占据着中会在重要的地位,里面的内容有系统自动生成,不可随意修改,然而在开发过程中,总是不可知的丢失,这里总结一下修补方法   #.在Eclipse里可以         ...