十分钟彻底理解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从入门开始(2)----基础
HTML文件结构 <html> <head>//网页头标记 <title>放置标题</title> </head> <body> ...
- [SQL] SQL 基础知识梳理(七)- 集合运算
SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...
- iOS开发之CALayer
1. 概述 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIView之所以能显示在屏幕 ...
- 开发检测MySQL主从同步插件
Nagios的状态码 OK 退出码0,表示正常工作 WARNING 退出码1,表示处于警告阶段 CRITICAL 退出码2,表示处于紧急状态,严重状态 UNKOEN 退出码3,表示无法获取 ...
- pyqt系列原创入门教程
pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...
- MySQL基础入门-第一课 新建数据库(linux版本)
MySQL linux 登录MySQL sudo ),name ),phone ) ); # 或者 ),name ),phone )); 数据类型 数据类型 大小(字节) 用途 格式 INT ...
- Linux下安装Java(JDK8)
一.文件准备 1.1 文件名称 jdk-8u121-linux-x64.tar.gz 1.2 下载地址 http://www.oracle.com/technetwork/java/javase/do ...
- Java变量和对象的作用域
大多数程序设计语言都提供了"作用域"(Scope)的概念. 对于在作用域里定义的名字,作用域同时决定了它的"可见性"以及"存在时间".在C, ...
- Sublime Text 3下载-汉化-插件配置
Sublime Text 3下载 不用说是上官方下载地址:http://www.sublimetext.com/3 Sublime Text 3 免费使用方法 Sublime Text 2的时候还有一 ...
- 【C语言】两种方式实现冒泡排序算法
题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行 ...