十分钟彻底理解javascript 的 this指向,不懂请砸店
函数的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>
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指向,不懂请砸店的更多相关文章
- [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!
十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...
- 十分钟读懂JavaScript原型和原型链
原型(prototype)这个词来自拉丁文的词proto,意谓“最初的”,意义是形式或模型.在JavaScript中,原型的探索也有很多有趣的地方,接下来跟随我的脚步去看看吧. 原型对象释义 每一个构 ...
- 深入理解JavaScript的this指向问题
Javascript的this用法 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function test(){ this.x ...
- 图解javascript中this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...
- javascript的this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...
- 十分钟理解JavaScript引擎的执行机制
关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- 第一百二十九节,JavaScript,理解JavaScript库
JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...
随机推荐
- web从入门开始(5)-----表单
1. 表单的概念 是用来获取客户端用户数据的(信息)的.如:注册表单,查询表单,登录表单等. 2. 表单的工作原理 1.浏览有表单的网页,填写一些必要的信息,然后单击某个按钮,进行提交. 2.这 ...
- apply()
apply() 1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) apply:方法能劫持另外一 ...
- bing翻译API调用方法
概述 前一段时间,遇到一个需求,需要对文章进行翻译,由于客户公司员工有国内的人员,也有国外的人员,为了照顾国外的同事,客户提出,当用户在手机端发布帖子,需要同时把帖子的内容翻译成英文,方便用户阅读.于 ...
- 什么是https
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...
- JavaScript作用域链和垃圾回收机制
作用域链 基本概念: 在了解作用域链和内存之前,我们先了解两个概念,分别是执行环境和变量对象. 执行环境:定义变量或者函数有权访问的其他数据,决定了它们各自的行为.每个对象都有自己的执行环境. 变量对 ...
- iOS 10 语音识别Speech Framework详解
最近做了一个项目,涉及到语音识别,使用的是iOS的speech Framework框架,在网上搜了很多资料,也看了很多博客,但介绍的不是很详细,正好项目做完,在这里给大家详解一下speech Fram ...
- Omi新成员omi-router正式发布
原文链接-https://github.com/AlloyTeam/omi/blob/master/tutorial omi-router omi-router是Omi框架专属的router插件,文件 ...
- python学习随笔(三)
在linux中输入密码,我们是看不到的,如果在python中直接输入是可以看的到的,执行以下程序 #!/usr/bin/env python username = raw_input("us ...
- P2物理引擎中文文档
P2物理引擎中文文档地址:https://github.com/schteppe/p2.js/wiki/Chinese-wiki-%E4%B8%AD%E6%96%87%E7%BB%B4%E5%9F%B ...
- 老李分享:大数据测试之HDFS文件系统
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...