JS的this本质
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本质的更多相关文章
- js闭包的本质
js之所以会有闭包,是因为js不同于其他规范的语言,js允许一个函数中再嵌套子函数,正是因为这种允许函数嵌套,导致js出现了所谓闭包. function a(){ function b(){ }; b ...
- JS的运行机制
代码块: JS中的代码块是指由<script>标签分割的代码段.JS是按照代码块来进行编译和执行的,代码块间相互独立(即就算代码块1出错,但不影响代码块2的加载和执行),但变量和方法共享. ...
- 个人对JS原型链的一些理解(prototype、__proto__)
前言 在我一开始学习java web的时候,对JS就一直抱着一种只是简单用用的心态,于是并没有一步一步地去学习,当时认为用法与java类似,但是在实际web项目中使用时却比较麻烦,便直接粗略了解后开始 ...
- 云笔记项目-补充JS面向对象编程基础知识
简单介绍: 此部分知识为在做云笔记项目中补充,因为云笔记项目中涉及到前端js,里面写了很多js脚本,用到了创建js属性和方法,在js中直接声明的属性和方法最终都会变成window的对象,即其成为了全局 ...
- App.js实现使用js开发app的应用,此文是中文文档
在阅读前,在此说明下,本人英文一直不好,所以该文档是借助翻译工具翻译的,阅读起来可能有点不好,请各位谅解,哪位大神有标准的中文文档请分享下 Github下载地址:https://github.com/ ...
- js的数组问题
目录: 1. 遇到的问题 2. 解决方案 3. 内部原理 4. 总结 1. 遇到的问题 前天在写js时,遇到了一个很奇怪的问题:我有两个数组变量a.b,在经过一些运算后,数组b中有一些值,然后我就把数 ...
- JS数组遍历方法
常用数组遍历方法: 1.原始for循环 var a = [1,2,3]; for(var i=0;i<a.length;i++){ console.log(a[i]); //结果依次为1,2,3 ...
- WebView全面学习(二)-- Native与js双方通信
WebView全面学习(二)-- Native与js双方通信 Native与js通信的本质 Native与js通信的核心在于WebView. 两端的通信主要还是单向的.假如要完成js->Nati ...
- JS高级(摘自简书)
JS高级 1. 访问对象属性(方法也是属性)的通用方式:obj['属性名'] 1. 属性名包含特殊字符,如"-".空格,访问:obj['content-type'] 2. 属性名不 ...
随机推荐
- CSS字体大小设置时的参考(转)
from:http://blog.sina.com.cn/s/blog_51cd580b0100gg6y.html font-size 设置的绝对关键字: 以下几个绝对字体大小的设置是有效的.当然他们 ...
- php输出错误信息
error_reporting(E_ALL); ini_set('display_errors','on'); header("Content-Type:text/html;charset ...
- HTTPS证书制作
openssl 安装可参照之前文章 1.mkdir /etc/ssl/xip.ioopenssl genrsa -out /etc/ssl/xip.io/xip.io.key 1024openssl ...
- 谈谈MSP430 的框架程序
最近在学习MSP430f149这块单片机,开始程序也没烧进去,弄了一天,发现串口不能下载,买了个jtag下载器,才搞定.现在也谈谈开始写程序的一些方法吧 程序重要的是框架,有这个基础之后才能行云流水的 ...
- PullToRefresh的个性化扩展
一:实现区别下拉刷新和上拉加载 参考资料:http://blog.csdn.net/losetowin/article/details/18261389 在PullToRefresh的类库的com.h ...
- job interview
一 , 7series clock 二, SDRAM comtroller (DDR) 4.熟悉DDR2/3协议或Ethernet相关协议,并有实际项目经验者优先: 三,AXI bus(AMBA) 四 ...
- 读jQuery官方文档:jQuery对象
jQuery对象 当用$符号包裹一个CSS风格选择器的时候,你得到一个jQuery对象. var heading = $('h1'); jQuery对象是对DOM ELement封装过后的数组.注意, ...
- c#结束winword.exe进程、
最近在做一个c#生成word的功能.调用了微软自带的COM组件. 生成完以后发现有一个winword.exe无法关闭.调试或修改代码都没有搞明白. 遂强制关闭进程了. System.Diagnost ...
- 通过js根据后台数据动态生成一个页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExportSelField ...
- Beyond Compare 相同文件对比结果仍显示红色 解决方案
转载:http://blog.sina.com.cn/s/blog_4d4bc1110100zj7x.html 1. 问题详细描述如下. 下图显示对比结果中,两侧的aaa.xml是一模一样,会话中 ...