第三节课总结之关于this指向,变量提升以及跨域的解决方案

2023-11-10

  1. this
  2. 变量提升
  3. 关于继承
  4. 跨域解决方法

>> this指向

Js是静态作用域:是在定义阶段就决定好了的,而不是在执行阶段才决定的。
参考资料:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
https://www.zhihu.com/question/19636194

this 指的是引用那些函数的对象(指向它执行的上下文环境)。一般this的场景

1.全局作用域下的this

如果是在浏览器环境下,this指向window,但是在严格模式下,函数中的this等于undefined
如果在node环境中,this指向global(但node环境下js文件中的this为{},也就是module.export)

2.对象中的this
当用对象调用自己里面定义的方法时,this指向的这个对象。 例如:

var obj = {
  id: 9,
  test: function() {
    return this.id;
  }
};
console.log(obj.test()); //9
3.原型链中的this
通过原型继承指向新创建的对象

4.构造函数中的this

指向实例化的对象

5.call 和 apply和bind中的this
    
function add(x) {
 return this.a + x 
} 
var obj = { a: 10 } 
var sum = add.call(obj, 8) 
//var sum = add.apply(obj, [8])
console.log(sum) // 18
它的第一个参数是绑定函数的运行环境。
>>箭头函数的this:
默认指向在定义它时,它所处的对象,而不是执行时的对象。
<script>
  var obj = {
    say: function () {
      var f1 = () => {
        console.log(this); // obj
        setTimeout(() => {
          console.log(this); // obj
        })
      }
      f1();
    }
  }
  obj.say()
</script>
结果:都是obj
f1继承父级this指代的obj,不管f1有多层箭头函数嵌套,都是obj.
<script>
  var obj = {
    say: function () {
      var f1 = function () {
        console.log(this);    // window, f1调用时,没有宿主对象,默认是window
        setTimeout(() => {
          console.log(this); // window
        })
      };
      f1();
    }
  }
  obj.say()
</script>
结果:window,window
第一个this:f1调用时没有宿主对象,默认是window
第二个this:继承父级的this,父级的this指代的是window

>>声明提升

Es5:
变量可以提升
函数表达式没有提升
函数声明优先于变量声明
fun1()
var fun1 = function () {
console.log(1)
}
// VM1327:2 Uncaught TypeError: fun1 is not a function
   // at <anonymous>:2:1
fun2()
var fun2 = function () {
console.log(2)
}

fun3()
var fun3 = function () {
console.log("fun3")
}
function fun3() {
console.log(3)
}
Es6:
let const 不存在变量提升(主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为)

Let变量的生命周期,声明阶段-暂时性死区-初始化-赋值阶段,在未初始化阶段就调用就会报错的。

>>继承 

es5:(之前的总结)

https://blog.csdn.net/weixin_36852235/article/details/80144048

es6:

Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。
class Point {}
class ColorPoint extends Point {}
上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Point类。下面,我们在ColorPoint内部加上代码。

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()  }}

上面代码中,constructor方法和toString方法之中,都出现了super关键字,它在这里表示父类的构造函数,用来新建父类的this对象

>>跨域

为什么会有跨域?
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

同源是指:
协议相同
域名相同
端口相同
限制范围:
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。

虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。下面,我将详细介绍,如何规避上面三种限制。

解决跨域有哪些方法?
Jsonp
Json+padding:
动态创建script标签,向服务器XXX发出请求。请求的查询字符串有个一个callback参数,用来指定回调函数的名字。
1.)原生实现:


<script>
    var script = document.createElement('script');
    script.type = 'text/javascript';


    // 传参并指定回调执行函数为onBack
    script.src = 'http://www.domain2.com:8080/login?user=admin&callback=onBack';
    document.head.appendChild(script);


    // 回调执行函数
    function onBack(res) {
        alert(JSON.stringify(res));
    }
 </script>

服务端返回如下(返回时即执行全局函数):
onBack({"status": true, "user": "admin"})

2.)jquery ajax:
$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "onBack",    // 自定义回调函数名
    data: {}
});
jsonp缺点:只能实现get一种请求。
优势:支持老的浏览器
Cros
需要浏览器和服务器同时支持,IE不能低于IE10。(IE8+:IE8/9需要使用XDomainRequest对象来支持CORS))



  GET http://x.stuq.com:7001/cros 500 (Internal Server Error)

这里介绍下简单请求,浏览器直接发出cors请求。在头信息中增加Origin字段

请求头中origin。标识本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段(详见下文),就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。

(1)Access-Control-Allow-Origin
该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。
withCredentials 属性
Cors请求默认不发cookie和HTTP认证信息。如果要发,客户端和服务器端都要设置。同时服务器端的Access-Control-Allow-Origin不能设为*.要与请求时的origin设置一样。一方面,开发者必须在AJAX请求中打开withCredentials属性。
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
并且这个cookie是服务端设置过的才会上传,要不然是不传的。
详细见阮老师的这篇文章:
http://www.ruanyifeng.com/blog/2016/04/cors.html


3.iframe  
4.cookie
两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie。
A:a.test.com
B:b.test.com
document.domain = 'test.com';
这种方法只适用于 Cookie 和 iframe 窗口

5.window.name
浏览器窗口有window.name属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。

 6.window.postMessage

主页面设置:popup.postMessage('Hello World!', 'http://bbb.com');

postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即"协议 + 域名 + 端口"。也可以设为*,表示不限制域名,向所有窗口发送
父窗口和子窗口都可以通过message事件,监听对方的消息。

// message事件的事件对象event,提供以下三个属性。
// event.source:发送消息的窗口
// event.origin: 消息发向的网址
// event.data: 消息内容
window.addEventListener('message', function(e) {
console.log(JSON.parse(e.data))//{msg: "hello world"}
console.log(e.origin)//http://x.stuq.com:7001
console.log(e.source)//window
}, false);

跨域解法大全:
https://www.cnblogs.com/roam/p/7520433.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三节课总结之关于this指向,变量提升以及跨域的解决方案 的相关文章

  • 数组的添加和删除过滤方法总结es6 filter()

    es6 filter 数组过滤方法总结 Array every x gt x 是每一个都要满足 Array some x gt x 是有一个满足 Array find findIndex 返回符合条件的第一个值 Array filter 过
  • C#进行图片压缩(对jpg压缩效果最好)

    直接上代码 1 public static class ImageCompress 2 3
  • js复制一个对象的方法,不改变原对象

    复制一个对象 不改变原对象简单方法如下 var obj a 1 b 2 es6新方法 Object assign var newObj Object assign obj es6新方法 扩展运算符 var newObj obj 有个弊端 就
  • Springboot实现filter拦截token验证和跨域

    文章目录 背景 注解配置filter 硬编码注册filter 跨域说明 方式2 配置注解 背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API
  • 什么是区块链----概念

    前言 从2016年年初开始 区块链这个概念越来越热越来越火 有人说他可以颠覆金融行业 也有人觉得这就是个噱头 这个2016火起来的技术其实早在2008年 比特币的诞生就基于区块链 技术火归火 落地的应用却没有那么多 周围的朋友同学都听说过这
  • 有关无人机的几点总结

    Pix APM 减震问题 X Y 方向震动必须小于0 3g Z方向必须小于0 5g 最好每个方向上都控制在0 1g 电机动平衡处理 T motor 在工厂已经做过动平衡处理 ArduPilot 4 0 代码中初始化函数已经移至 AP veh
  • 解决Android Studio安装过程中“SDK tools directory is missing”的问题

    SDK tools directory is missing 这是因为安装时你的计算机无法连接到google的服务器 对google服务器的域名地址解析出问题了 无法从google服务器下载SDK tools 安装时自动跳过安装SDK to
  • 机器入门学习方法与学习路径

    机器学习方法与学习路径 1 数学基础 有无数激情满满大步向前 誓要在机器学习领域有一番作为的同学 在看到公式的一刻突然就觉得自己狗带了 是啊 机器学习之所以相对于其他开发工作 更有门槛的根本原因就是数学 每一个算法 要在训练集上最大程度拟合
  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • tensorflow-gpu版本详细安装教程(Win10,Python3.7.9,cuda11.2,cudnn8.1.0)

    目录 cuda安装 cudnn安装 python安装 tensorflow安装 cuda安装下载 首先要注意自己的显卡支持cuda的版本 可以这样自查 可以看到适合自己的cuda版本 这里我选择了cuda11 2版本 cuda安装包下载链接
  • 三招搞定你的ubuntu安全问题

    本篇主要介绍以下三个部分 反病毒引擎clamav的安装和使用 ubuntu ufw限制访问地址 ubuntu用户连接失败锁定指定时间 反病毒引擎clamav的安装和使用 简介 ClamAV是一款开源的反病毒引擎 用于检测病毒 特洛伊木马 恶
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先
  • 使用express封装一个简单的http代理服务器以及手动设置Access-Control-Allow-Origin解决跨域问题

    一 跨域是什么 先来了解一下什么是跨域 才能知道如何解决跨域问题 跨域 出于浏览器的同源策略限制 使浏览器不能执行其他网站的脚本 同源策略是浏览器对 javascript 施加的安全限制 所谓同源就是指在同一个域内 就是两个地址具有相同的协
  • python-算法时间复杂度和空间复杂度

    大O表示法 O 名称 举例 1 常量时间 一次赋值 logn 对数时间 折半查找 n 线性时间 线性查找 nlogn 对数线性时间 快速排序 n 2 平方 两重循环 n 3 立方 三重循环 2 n 指数 递归求斐波那契数列 n 阶乘 旅行商
  • 前端面试中级开发必须知道跨域解决方案

    跨域 不同协议 不同URL 不同端口号都会产生跨域 解决跨域的方案 postMessage web worker iframe Jsonp 用script标签请求地址 标签可以跨域 cors 服务端设置响应头信息 允许跨域 1 最常见用co
  • 非常详尽的 Linux 中 WEB服务器配置与管理 (通过例子来讲解)

    Apache服务器的安装与启动 检查是否已经安装了APACHE并启动它 这是已安装好的状态 root root rpm qa grep httpd httpd tools 2 2 15 53 el6 x86 64 httpd 2 2 15
  • PuTTY 通过 SSH 访问出现错误:"expected key exchange group packet from server"。

    使用 PuTTY 通过 SSH 访问出现错误 expected key exchange group packet from server 解决 在 PuTTY 的左侧窗格中 导航到 连接 gt SSH gt Kex 在算法选择策略下 选择
  • XSS & SQL injection

    作者 CyberPhreak XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X Web Security XSS more X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 介绍在这篇文章中我将说明所有关于X
  • C#与Java的不同

    https www cnblogs com Yan3399 p 17324904 html 1 C 对应java中关键字 base super this this sealed final 1 base关键字 对应java super C
  • C#有像Java ThreadLocal的类似实现吗?

    在C 中 可以使用 ThreadLocal

随机推荐

  • Introspector内存溢出的原理解析

    JavaBeans Introspector是一个类 位置在Java bean Introspector 这个类的用途是发现java类是否符合javaBean规范 也就是这个类是不是javabean 具体用法可以参照jdk文档 上面的意思就
  • 常用音频接口:TDM,PDM,I2S,PCM

    折腾 整理 SoC CPU MEDIATEK MT8516详解 期间 看到T8516介绍中包含 麦克风语音输入控制和连接的音频产品中包含 I2Sx2 4 个频道 TDM 最多 8 个频道 和 PDM 输入 2 个频道 等广泛的接口 不太熟悉
  • 中国猎头公司排名 (前十)

    4月3日 平时能够收到不少猎头公司排名评选的邀请 但自己一直怀疑这类排名评选的可行性和公信力 人为因素在这样的评选中占了太大的成分 因为喜欢搜索这个职业 所以我一直是一个谷歌Google的粉丝 Google的成功和深入人心和它坚持自己的 搜
  • hue+oozie并发集群阻塞的调优经历

    hue oozie并发集群阻塞的调优经历 问题描述 使用hue oozie进行数据仓库开发 部署了大量workflow和并发任务 定时晚上集中时间执行时出现任务卡死状态 全部是oozie launcher的job任务 方案一 调大集群资源
  • keras ANN 分类实战

    import pandas as pd import numpy as np from sklearn model selection import train test split from keras utils import np u
  • Javascript: hash tables in javascript

    Copyright 2010 Tim Down Licensed under the Apache License Version 2 0 the License you may not use this file except in co
  • 软件授权注册码_授权码授予

    OAuth是一种开放的授权标准 可让客户端代表资源所有者访问受保护的服务器资源 资源所有者可以是其他客户端或最终用户 OAuth还可以帮助最终用户授权第三方访问其服务器资源 而无需共享其凭据 例如用户名和密码 本系列文章遵循RFC6749中
  • mysql开启事件调度失败_MySQL事件调度器无效的问题原因以及解决方法

    最近写了个定时事件 发现无法执行 先在my ini中加了配置event scheduler ON 重启MySQL无效 在navicat中直接执行 SET GLOBAL EVENT SCHEDULER ON 会报错 错误信息是 Error C
  • https://app.hackthebox.com/machines/Soccer

    https app hackthebox com machines Soccer kwkl kwkl cat etc hosts 1 127 0 0 1 localhost 127 0 1 1 kwkl kwkl kwkl The foll
  • 基本术语(告诉你西瓜书为什么叫西瓜书)

    为什么这本 机器学习 封面会有很多西瓜 为什么要叫他西瓜书 就因为封面是西瓜 因为所有的这些个基本术语的理解和后续一些问题的解释以及比喻 周大大都是用西瓜来做比喻滴 通俗易懂 恰到好处 注意 下面只做我归纳的简单介绍 如有不全 可以去百度一
  • 算法设计与分析—贪心法求解背包问题C++(学习笔记)

    用贪心法求解如下背包问题的最优解 有7个物品 重量分别为 2 3 5 7 1 4 1 价值分别为 10 5 15 7 6 18 3 背包容量W 15 写出求解过程 include
  • 关于自研maven依赖在idea中导入失败

    Could not find artifact cn bugstack middleware db router spring boot starter jar 1 0 1 SNAPSHOT 解决方法 先下载 GitHub Adzc zh
  • js中import报错Uncaught SyntaxError: Unexpected identifier

    不管导入什么都说 意外的标识符 网上有解释说仔细看标点的就是说你不细心 这确实是方法 不过import那个错基本上并不是 先说解决方法 你需要babel编译一下 webpack打包然后就没有这个错了 然而我今天一不小心做了死 一直在报那个错
  • Java原生代码连接MySQL数据库

    本章我们介绍 如何用java原生代码实现连接MySQL数据库并实现基本的增 删 改 查操作 为了便于演示 首先我们使用Navicat Premium新建一个user表并添加如下数据 我们需要导入连接MySQL所需要的jar包 jdbc驱动包
  • 反射型XSS、存储型XSS和DOM型XSS的简介及XSS常见payload构造及变形

    渗透学习 XSS跨站脚本之XSS基础 文章目录 渗透学习 前言 本文只做学习用途 严禁利用本文提到的技术进行非法攻击 否则后果自负 本人不承担任何责任 一 XSS漏洞原理 二 XSS分类 1 反射型XSS 2 存储型XSS 3 DOM型XS
  • PPT制作 ---------插入图片背景颜色与模板的背景颜色不一致

    今天在制作ppt时候 遇到插入图片背景颜色与模板的背景颜色不一致 这样做出来效果不好 在网上查了攻略后 可以利用ppt自带的图片删除背景来调节 一顿操作后 记下来说不定以后工作时候需要使用
  • Unity人形动画反向动力学IK动画实现

    什么是反向动力学 以手掌移动为例子 正向动力学 这个 力 是由你的身体躯干发出的 改变你的手臂位置 带动你的手掌位置移动 反向动力学 这个 力 是直接在你的手掌上 直接改变你手掌的位置 并且通过手臂进而带动整个身体 力 传递的方向是相反的所
  • Java反射使用示例

    当我们使用 Java 反射时 有时需要在运行时动态地调用某个类的方法 例如使用配置文件指定要调用的方法 或者根据用户输入来决定调用哪个方法等 下面我们就来看几个动态调用方法的例子 调用无参方法 假设有一个类名为 MyClass 它有一个无参
  • 华为OD机试真题-缓存需要最少金币数【2023.Q1】

    题目描述 静态扫描可以快速识别源代码的缺陷 静态扫描的结果以扫描报告作为输出 1 文件扫描的成本和文件大小相关 如果文件大小为N 则扫描成本为N个金币 2 扫描报告的缓存成本和文件大小无关 每缓存一个报告需要M个金币 3 扫描报告缓存后 后
  • 第三节课总结之关于this指向,变量提升以及跨域的解决方案

    this 变量提升 关于继承 跨域解决方法 gt gt this指向 Js是静态作用域 是在定义阶段就决定好了的 而不是在执行阶段才决定的 参考资料 https developer mozilla org en US docs Web Ja