this是什么?
JavaScript中,this关键词指的是他所属的对象;
它拥有不同的值,具体取决于它的使用位置。

1、在单独情况下,this指向全局对象window;
2、在函数中,this指向全局对象window;
3、在严格模式的函数中,this为undefined;
4、在对象的方法中,this指的是所有者对象;
5、在事件中,this指的是接收事件的元素;
6、使用call/apply方法,可以将this引用到任何对象。

上述1/2可以说明普通函数中,内层函数不能从外层函数中继承this的值,在内层函数中,this会是window或是undefined。
临时变量self用来将外部this值导入到内部函数中(另外的方式是在内部函数执行bind(this))

<script>
// var a = 43;
function foo() {
var a = 0;
console.log(this.a); // 2
return function (a) {
console.log(this.a); // undefined或43 把var a = 43; 注释掉,会打印出undefined,不注释就是43(说明上述1/2点)
};
} var obj = { a: 2 }; foo.call(obj)(); // 结果请看上述注释 foo的this被绑定到obj,注意是foo作用域内的this指向obj,返回函数的this为window
</script> <script>
console.log("--------------------------");
function foo2() {
var self = this;
console.log(this.a); // 3
setTimeout(function () {
var a = 4;
/*
下面这行代码里面的的a,表示的是对变量的调用,如果说匿名函数没有声明var a = 4;或匿名函数没有带形参,
又或上层作用域foo2中没有形参及变量声明、最外层没有声明的话,则就是报错,
而不是undefined:Uncaught ReferenceError: a is not defined
有形参则是undefined。
换句话说console.log(a)中就是去查找变量a啊,如果层层查找没有发现形参,也没有声明,那肯定是报错的啊。
*/
console.log("形参:" + a); // 形参:4
console.log("对象属性:" + this.a); // 对象属性:undefined
}, 100); var self = this;
setTimeout(function () {
console.log(self.a); // 3 临时变量self将外部this值导入到内部函数。
}, 100);
} var obj2 = { a: 3 }; foo2.call(obj2); // 2
// undefined
// -----------------------
// 3
// 形参:4
// 对象属性:undefined
// 3
</script>

随机推荐

  1. 什么是 bean 装配?

    装配,或 bean 装配是指在 Spring 容器中把 bean 组装到一起,前提是容器需要 知道 bean 的依赖关系,如何通过依赖注入来把它们装配到一起.

  2. 学习RabbitMQ(三)

    1 用户注册后(会立即提示注册成功),过一会发送短信和邮件通知 发布/订阅模型 以上模式一般是用户注册成功后,写入一条数据到mysql,在发送一条消息到MQ! 如果不用消息中间件(或者简单的做成异步发 ...

  3. 学习GlusterFS(三)

    glusterfs,GNU cluster file system,创始人Anand Babu Periasamy,目标:代替开源Lustre和商业产品GPFS,glusterfs是什么: cloud ...

  4. Numpy实现机器学习交叉验证的数据划分

    Numpy实现K折交叉验证的数据划分 本实例使用Numpy的数组切片语法,实现了K折交叉验证的数据划分 背景:K折交叉验证 为什么需要这个?在机器学习中,因为如下原因,使用K折交叉验证能更好评估模型效 ...

  5. webSocket原理探索

    本文概述 Web Sockets的目标是在一个单独的持久连接上提供全双工.双向通信.在Javascript创建了Web Socket之后,会有一个HTTP请求发送到浏览器以发起连接.在取得服务器响应后 ...

  6. java中将科学技术发转为正常数据

    import java.text.NumberFormat; public class test { public static void main(String[] args) { double d ...

  7. 数组 indexOf()

    众所周知,indexOf()这个方法经常出现在字符串的使用中,也许是用来寻找字符串中某一字符在字符串中的位置,或者也可以用来寻找字符串中重复出现的字符有哪些.对于刚接触 JS 的我们来说,在对数组的操 ...

  8. vue点击按钮复制文本框内容

    1.npm进行安装 npm install clipboard --save 2.在需要使用的组件中import 引用方法:import Clipboard from 'clipboard'; 3.添 ...

  9. 【合集】Python基础知识【第二版】

    更新部分 为了避免冗长的代码影响大家观感,将部分案例拆开 增加部分知识点,为了减少大家阅读的负担,尽可能使用短句子,但知识点不可能全覆盖,笔者不是写书,就算是写书也不可能全面,请同学们自行去补充 增加 ...

  10. 文件上传——IIS6.0解析漏洞

    介绍 IIS6.0漏洞可分为目录漏洞和文件漏洞 目录漏洞 访问*.asp格式命令的文件夹下的文件,都会被当成asp文件执行 文件漏洞 畸形文件命名 123.asp -> 123.asp;.txt ...