ES5-拓展 this指向的总结

每个函数在执行时都有自己的this指向

1. 默认绑定规则:

  1. 全局中,this指向window this === window
  2. 函数的独立调用,this默认指向window (不要把独立调用理解成window调用
// 函数在全局中调用,也就是被window调用
function test(){console.log(this === window) // true
}
test() // window.test()

2. 隐式绑定规则(对象调用)

  1. 通过对象的属性来调用方法时,this指向对象(谁调用指向谁)
var a = 0;
var obj = {a: 2,foo: function () {console.log(this) // 1. 指向objfunction test() {console.log(this) // 2. 指向windowconsole.log(test.caller) // 3. foo匿名函数}test() // 2. 函数独立调用// 4. test声明,test调用,就是IIFE; (function () {console.log(this) // window 5. 直接写IIFE})()}
}
obj.foo()
var a = 0
function foo() {console.log(this) 
}
var obj = {a: 2,foo: foo
}
obj.foo() // obj 隐式绑定规则
var bar = obj.foo // 隐式丢失:方法被重新赋值
bar() // window 独立调用
  • 参数赋值

预编译的过程中,实参被赋值为形参(值的拷贝过程:浅拷贝)

var a = 0
function foo() {console.log(this) 
}
function bar(fn){ // bar是高阶函数fn()fn.bind(obj)() // 指向obj// 父函数有能力决定子函数this的指向
}
var obj = {a: 2,foo: foo
}
bar(obj.foo) // window 独立调用
  • 数组方法等
var arr = [1]
// forEach还有第二个参数,this指向!!,不传默认是this
arr.forEach(function () {console.log(this) // window
})
arr.forEach(() => {console.log(this) // window
})
function test() {console.log(this)
}
// 不够好的方式
arr.forEach(test.bind(arr)) // arr
// 正确的做法
arr.forEach(function () {console.log(this) // arr
}, arr)
// 不要使用箭头函数+第二个参数改变this指向
arr.forEach(() => {console.log(this) // window 
}, arr)
// setInterval(() => {
//     console.log(this) // window
// }, 1);
  • 例子
var name = '222'
var a = {name: '111',say: function () {console.log(this.name)}
}
var fun = a.say;
fun(); // 222 独立调用
a.say(); // 111 对象调用

FnName.caller并不能用来检测是否是window调用的函数
返回调用指定函数的函数.
如果一个函数f是在全局作用域内被调用的,则f.caller为null,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.

2.* IIFE内的this指向window(浏览器中/非严格模式)

  • 不考虑node中

3. 显示绑定 call、apply、bind

  • bar.call(obj,1,2,3,4,5)

  • bar.apply(obj,[1,2,3,4,5])

  • bar.bind(obj)(1,2,3,4,5)

  • 当参数为原始值时,会包装,this指向对应的包装类

  • 当参数为null、undefined,this指向window

  • IIFE + 显示绑定(显示绑定优先级 >> IIFE)

var obj = {a: 1
}; (function () {console.log(this) // obj}).call(obj) 

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。

const module = {x: 42,getX: function() {return this.x;}
};const unboundGetX = module.getX;
console.log(unboundGetX());
// The function gets invoked at the global scope
// expected output: undefinedconst boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// expected output: 42

bind返回值和原函数不相等,返回一个新函数

const module = {x: 42,getX
};
function getX(){return this.x;
}const boundGetX = module.getX.bind(module);
console.log(boundGetX)
console.log(boundGetX())
console.log(boundGetX === getX); // false

在这里插入图片描述

4. new 绑定(优先级 >> 显示绑定)

function Person() {this.a = 'a'console.log(this) // Person实例 {a: 'a'}return {a: 'hhh'}
}
var p = new Person()
console.log(p) // 普通对象{a: 'hhh'}

在这里插入图片描述

6. 闭包中

var a = 'a';
var obj = {a: 2,foo: function () {var c = 'c'console.log(this) // objfunction test() {console.log(this) // 3. windowconsole.log(c) // cconsole.log(a) // a(全局上的)console.log(obj) // 能访问}return test // 1. test是闭包// 当函数执行时,导致函数被定义,并抛出}
}
obj.foo()() // 2. test() 独立调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内初创企业选择云计算服务器价格对比

假设我们是一家初创企业,现在要选择第一台服务器。业务还未确定,只知道是互联网业务 要求: 至少2核,否则多线程的软件都跑不了至少4G内存,这样可以运行数据库或者elasticsearch这种比较吃内存的东西。或者说&#xff0…

ES5-拓展 箭头函数的this、this的优先级

让内部函数的this指向和父函数的this,可以显示改变this指向,也可以使用箭头函数 箭头代替了function关键字 箭头函数内部没有this指向,箭头函数的this是稳定引用父作用域的。因为它的存在就是要稳定this指向。 适用于普通函数的所有绑定规则…

java 实现压缩单个文件

先来实现一个简单的单文件压缩,主要是为了解一下压缩需要使用到的流。。 效果: 说明:压缩实现使用ZipOutputStream 代码: package com.gx.compress;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im…

jekins构建触发器详解

jenkins版本:2.89.2 1、触发远程构建 (例如,使用脚本):通过一个网址的访问来触发构建,这样就不需要登录jenkins系统也能触发构建了。 示例地址: http://localhost:8848/job/FlashRegistration/build??token口令&cause书写构…

ES5-拓展 隐式数据类型转换

Boolean转换原则:非假即真 6种虚值 原始值转换为原始值 对象转换为原始值 Date()和new Date() new Date可以不写括号(new方式返回的一定是对象),返回Date对象Date()返回函数执行,返回时间字符串 引用值转原始值 先找valueOf方法(一般…

Swagger的简单入门【转载】

一、Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持,这篇文章我们继续讨论这个话题,不过,我们这里不再讨论Restful API如何实现,而是讨论Restful API文档的维护问题。 在日常的工作中,我们往往需要给前…

visual studio code搭建本地服务器(node.js+express)

一、安装node.js(常规软件安装流程,比较简单,不用赘述) 二、安装express框架 1. 打开Windows命令提示符,输入: npm install express -g,等待,安装好如下所示: npm instal…

chrome调试

技术拓展直播课8 按chrome的官方文档 长按刷新 清除缓存(不一定好使) Ctrl f 查找类 console控制台见b站 bilibili source面板直接打断点 效果和debugger一样 单步调试 进入到函数的下一步 网速 no throttling 是否需要过滤 domcontentloaded d…

61-1 认识webpack

认识webpack 面向过程开发的不便引入外部js执行顺序面向对象开发 加载多个文件耗时更多 增加了http请求 引入过多js变量来源不明 优化 使用前先import 但使用import语法需要借助工具webpack翻译为浏览器可以解析的语法安装node自动携带npmwebpack若没有全局安装 需要使用npx…

css font简写

一、字体属性主要包括下面几个 font-family,font-style,font-variant,font-weight,font-size,fontfont-family(字体族): “Arial”、“Times New Roman”、“宋体”、“黑体”等;font-style&…

javascript --- 原生的拖拽功能实现

准备一个方块: <style>.drag{background-color:#aaf;position:absolute;} </style> <div class"drag" style"width:100px;height:100px;top:0;left:0"></div>监听鼠标的按住事件: let dragDiv document.getElementsByClassName…

web安全学习-验证机制存在的问题

验证机制是应用程序防御恶意攻击的中心机制。它处于防御未授权的最前沿&#xff0c;如果用户能够突破那些防御&#xff0c;他们通常能够控制应用程序的全部功能&#xff0c;自由访问其中的数据。缺乏安全稳定的验证机制&#xff0c;其他核心安全机制&#xff08;如回话管理和访…

ES5-拓展 原型链、继承、类

Symbol不是构造函数 Object不是原型是实例对象 他的构造器继承原型上的构造器 undefined是未定义 null是空指针 一、原型链 1. 函数也是实例对象 2. 构造函数Object是由Function构造出来的 3. 有一种说法是&#xff0c;原型链的终点是null Object.prototype.__proto__指向nul…

spring boot 加载application配置文件

这就要注意了 转载于:https://www.cnblogs.com/huochaihe/p/9397849.html

javascript --- 防抖与节流

先做一个监听鼠标移动的base: <style>#content{height:150px;width:200px;text-align:center;color:#fff;background-color:#ccc;font-size: 70px;} </style> <div id"content"></div> <script>let content document.getElementById…

DOM-9 【实战】模块化开发Todolist(面向过程)

模块化分类 按dom结构划分按功能划分&#xff08;组件化开发&#xff09; 模块与模块之间可以相互依赖&#xff0c;但互不影响 模块&#xff1a;IIFE赋值给一个变量&#xff0c;当引入模块时&#xff0c;IIFE会立即执行 单标签闭合才符合W3C规范display、position放在上面css是…

DOM-10 面向对象开发Todolist

将插件配置项写在html的div里&#xff0c;data-config自定义属性&#xff0c;外单引号&#xff0c;内双引号&#xff08;内部是JSON字符串&#xff09; <div class"todo-wrap" data-config{"plusBtn":"j-show-input","inputArea":…

Ansible基础概述

一、Ansible简介 Ansible基于Python语言实现&#xff0c;由paramiko和PyYAML两个关键模块构建。Ansible的编排引擎可以出色地完成配置管理&#xff0c;流程控制&#xff0c;资源部署等多方面工作。Ansible公司负责Ansible开源软件的维护&#xff0c;管理。一般软件的更新大概每…

DOM-12 【模拟桌面待讲评】鼠标事件深入、点击与拖拽分离、双击事件

鼠标事件深入 点击事件 mousedown mouseupposition: absolute 会将内联元素变为块级&#xff08;比如a&#xff09;a标签的协议限定符&#xff08;伪协议&#xff0c;防止跳转和刷新&#xff0c;让href不生效&#xff09;&#xff0c;javascript:;&#xff0c;可以让点击和拖…

scrapy的操作

转载于:https://www.cnblogs.com/mengqingjian/p/8337772.html