函数的this指向谁,和函数在哪里被定义的,函数在哪里被执行的没有半毛钱关系,只遵守下面的规律:

在非严格模式中:

1、自执行函数里面,this永远指向window;

    <script>
var a = 1;
var o = {
a: 2,
fn: (function(){ //自执行函数,在定义的时候就已经执行啦
console.log('自执行函数里面是window',this.a); //自执行函数里面的this指向的是window
return function() { // 但是这里的this 指向的是谁调用的这个函数
console.log('但是还是要具体问题具体分析',this.a)
}
})()
} o.fn();
</script>

结果请看

2、给元素的某一个行为绑定方法,当行为触发所调用的函数里面this指向的该dom 元素;

    <script>
var dd = document.getElementById('dd');
function f1 () {
console.log(this);
}
dd.onclick=f1; // 点击的那个dom对象
</script>

但是我要是稍微改一下:

    <script>
var dd=document.getElementById('dd');
function fn () {
console.log(this);
}
dd.onclick=function(){
console.log(this); // dom 对象
fn(); // window ,这时候就看该函数是被谁调用的啦
}
</script>

3、看看函数执行有咩有 . ,如果有则是前面的那个,如果没有则是window

4、在构造函数里面,this 指向的是当前的实例;

<script>

       function fn() {
console.log(this);
};
function ff () {
this.name="杜俊成";
this.say=function(){
console.log(this); // this指向该构造函数的原型
fn() // window ,因为fn 函数的直接调用者是window,
}
} var a = new ff();
a.say();
</script>

 5、使用call / apply 改变了this 的指向;(关于call 和 apply 想一劳永逸的搞明白吗?请看我的一篇文章)

严格模式:

1、自执行函数里面,this永远指向undefined;

    <script>
var obj ={
fn:(function(){
// this => undefined
console.log(this)
return function(){
// this=> obk
console.log(this);
}
})()
}
obj.fn; //obj.fn 的方法在声明的时候就已经被执行了, window
obj.fn(); //obj.fn的自执行方法返回的方法执行 obj
</script>

2、看前面有咩有 . ,如果有则是前面的那个,如果没有则是undefined

总结就是:严格模式和非严格模式的区别:当调用主体不明时,严格模式是undefined,非严格模式是window

<script>
'use strict';
function fn(){
alert(this);
}
/*非严格模式*/
fn.call()//this - window;
fn.call(null)//this - window;
fn.call(undefined);//this -undefined
/*严格模式下,给call或apply第一个参数传谁this就是谁,不传就是undefined*/
fn.call() //this - undefined;
fn.call(null) //this -null;
fn.call(undefined) //this-undefined
</script>
es6 新增的箭头函数比较特殊。我们使用function定义的函数,在定义时,它并不知道这个this会指向哪里,只有在运行的时候才能明确this的值。
 
箭头函数本身不具有this,它会直接绑定到它的词法作用域内的this,也就是定义它时的作用域内的this值。所以试图使用apply,call等方法修改箭头函数的this是不会成功的,因为箭头函数自身没有this。所以我们来看下面一段代码:
var func = () => {
console.log(this);
}
func(); // Window
func.apply({}); // Window
function func() {
console.log(this)
return () => {console.log(this)}
};
func()()
// Window
// Window
func.apply({a:1})()
// Object {a:1}
// Object {a:1}
func.apply({a:2})()
// Object {a:2}
// Object {a:2}

通过这段代码,我们应该可以明确的看出来,箭头函数是直接使用的它词法作用域内的this,也就是定义它时的作用域内的this。当我们修改它的作用域内的this值,也就是func的this值时,在箭头函数内也可以反映出来。用作对比,我们看下使用function定义的函数:

function func() {
console.log(this)
return function(){
console.log(this)
}
};
func()() //window window
func.apply({a:1})() // {a:1} window
func.apply({a:2})() // {a:2} window

github地址:https://github.com/dujuncheng

十分钟彻底理解javascript 的 this指向,不懂请砸店的更多相关文章

  1. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  2. 十分钟读懂JavaScript原型和原型链

    原型(prototype)这个词来自拉丁文的词proto,意谓“最初的”,意义是形式或模型.在JavaScript中,原型的探索也有很多有趣的地方,接下来跟随我的脚步去看看吧. 原型对象释义 每一个构 ...

  3. 深入理解JavaScript的this指向问题

    Javascript的this用法 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function test(){ this.x ...

  4. 图解javascript中this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...

  5. javascript的this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...

  6. 十分钟理解JavaScript引擎的执行机制

    关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...

  7. 后端技术杂谈11:十分钟理解Kubernetes核心概念

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...

  8. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  9. 第一百二十九节,JavaScript,理解JavaScript库

    JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...

随机推荐

  1. JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    本篇博客就完整的来聊一下如何在Eclipse中创建的Maven Project.本篇博客是JavaEE开发的开篇,也是基础.本篇博客的内容干货还是比较多的,而且比较实用,并且都是采用目前最新版本的工具 ...

  2. Storm(2015.08.12笔记)

    2015.08.12Storm   一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架.   Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...

  3. 定时任务框架APScheduler学习详解

    APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站的程序等等,都涉及到了关于定时任务的问题,第 ...

  4. netsh导入导出IPSec配置策略

    首先提一句: ipsec规则中,filter action为允许的比拒绝的优先级要高,其它的没有顺序关系,经测试验证! 参考:http://tech.techweb.com.cn/thread-354 ...

  5. lsusb命令

    运行 yum install libusb usbutils

  6. J2那几个E和Web基础

    收到PHP童鞋的反馈: 我觉得不用讲太基础的语法,基础语法大家自己去看,主要讲讲java web开发的一个流程,从开始写代码,到编译,发布,上线,回滚整个流程 大体上的环节,以及需要用到哪些工具 具体 ...

  7. 【C++】模拟实现auto_ptr

    看了<Effctive C++>,里面提到用对象去管理资源,可以有效防止内存泄漏. 结合auto_ptr特性,稍微思考了一下,实现了一个简单的auto_ptr (因为代码量小,就不分文件了 ...

  8. js 操作属性

    操作属性: 对象.setAttribute('属性名','值'); - 添加属性 对象.getAttribute('属性名'); - 获取属性值,如无此属性,那么返回null 对象.removeAtt ...

  9. AngularJS1.X学习笔记4-内置事件指令及其他

    AngularJS为我们定义了一系列事件指令,方便我们对用户的操作作出响应.甚至他还有一个可选模块提供了触摸事件和手势事件的支持,为移动端开发提供了可能.现在开始学习一下AngularJS的事件指令. ...

  10. AngularJS1.X学习笔记2-数据绑定

    上一篇从整体上认识了Angular,从现在开始更加深入的学习Angular的特性.本次学习的是数据绑定.应该所有的MVC框架都会用到数据绑定,比如我所知道的ThinkPHP.struts等,只有实现了 ...