22 严格模式&this关键词&let&const
严格模式:
ECMA5后的新指令:"use strict"
它不算一条语句,而是一段文字表达式,更早版本的JavaScript会忽略它。
严格模式无法使用未声明的变量。
严格模式的特点:
- 在函数内部声明严格模式,拥有局部作用域。只有函数内部的代码按照严格模式执行。
- 不允许使用未声明的对象
- 不允许删除对象
- 不允许删除函数
- 不允许重复函数参数名
- 不允许八进制数值文本和转义字符
- 不允许写入只读属性、只能获取的恶属性
- 不允许删除不可删除的属性如prototype
- 不允许使用为未来预留的关键词
- 在严格模式下,函数中的this是undefined
this关键词:取决于它使用的位置,指代它所属的对象
- 方法中,指代所有者对象(在JavaScript中函数一般通过函数名来调用,而方法则是通过对象来调用的函数)
- 单独情况下,指代全局对象(object Window)
- 函数中,指代全局对象
- 函数中,严格模式下,this是undefined
- 事件中,this指代接收事件的HTML元素
- call()和apply()可以用于将另一个对象作为参数,调用对象方法,使得方法中的this指向参数对象。
<script>
//创建对象
var person = {
name : "lisi",
age : 18,
fullName : function (){
return this.name + " " + this.age;
}
}; //显示对象中的数据
//方法中的this指代方法所有者对象,person.fullName()中的this指代person对象
document.getElementById("demo").innerHTML = person.fullName();
<script>
//严格模式下,函数中的this是undefined
"use strict";
document.getElementById("demo").innerHTML = myFunction();
function myFunction() {
return this;
}
</script>
<!-- 在HTML事件中,this指代接收此事件的HTML元素 -->
<button onclick="this.style.display='none'">点我消失</button>
<script>
// call会使this对象指向传进来来的参数对象,因此person1的fullName方法调用的是person2的变量。
var person1 = {
fullName : function(){
return this.name + " " + this.age;
}
}
var person2 = {
name : "lisi",
age : 2
}
alert(person1.fullName.call(person2));
</script>
严格模式的优点:
- 使我们更容易编写安全的JavaScript
- 把之前可接受的坏语法转变为真实的错误
- 在普通JavaScript中,错打变量名会创建新的全局变量,在严格模式中会抛出错误,无法创建。
- 在普通JavaScript中,如果向不可写属性赋值,开发者不会得到任何错误反馈。
- 在严格模式中,向不可写的、只读的、不存在的属性赋值,或者向不存在的变量或者对象赋值,将抛出错误、
let关键字:
- let对象在未声明之前不可以使用,否则会报错:ReferenceError variable is undefined
- var声明的变量属于全局对象window,let声明的变量不属于window
- 在块外声明,let和var都拥有全局作用域,区别是let声明的对象不属于window。
- 在相同的块或作用域中,var和let声明的对象不允许相互覆盖,即不能重新声明同名对象,否则会报错:already declared.
- 在不同的块中,可以使用let重新声明对象
循环作用域:
<script>
var i = 7;
for( i = 0;i < 10; i++){}
//此处i = 10
document.getElementById("demo").innerHTML = i;
</script>
<script>
let i = 7;
for( i = 0;i < 10; i++){}
//此处i = 10
document.getElementById("demo").innerHTML = i;
</script>
<script>
let i = 7;
for( let i = 0;i < 10; i++){}
//此处i = 7,如果在循环内用let声明了i,那么i只有在循环内才是可见的
document.getElementById("demo").innerHTML = i;
</script>
const关键字:
与let相似,区别在于const变量需要在声明时就赋值,而且不能重复赋值,否则报错:syntaxError。
可以对const声明的对象属性与数组元素进行更改,但是无法对其重新赋值。
在相同的块或者作用域中,const定义的变量不允许与var和let定义的变量重复声明,否则报错。
22 严格模式&this关键词&let&const的更多相关文章
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- 22.访问者模式(Vistor Pattern)
using System; using System.Collections; namespace ConsoleApplication5 { /// <summary> /// 访问者模 ...
- C#设计模式(22)——访问者模式(Vistor Pattern)
一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- 再起航,我的学习笔记之JavaScript设计模式22(访问者模式)
访问者模式 概念介绍 访问者模式(Visitor): 针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法 解决低版本IE兼容性 我们来看下面这段代码,这段代码,我们封装了一个绑定 ...
- 22状态模式State
一.什么是状态模式 State模式也叫状态模式,是行为设计模式的 一种.State模式允许通过改变对象的内部状态 而改变对象的行为,这个对象表现得就好像修改 了它的类一样. 二.状态模式的应用场景 状 ...
- C#设计模式学习笔记:(22)备忘录模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8176974.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十个模式--备 ...
- 观察者模式(Observer)和发布-订阅者模式(Publish/Subscribe)区别
观察者模式:定义一对多的关系,让多个观察对象同时监听某一个主题对象,主题对象状态发生变化就通知所有观察者对象.所以它是由两类对像组成:Subject主题+Observer观察者.主题发布事件,观察者通 ...
- JavaScript 设计模式: 发布者-订阅者模式
JavaScript 设计模式: 发布者-订阅者模式 发布者-订阅者模式 https://github.com/Kelichao/javascript.basics/issues/22 https:/ ...
随机推荐
- Docker - 构建一个简单的应用镜像
概述 做个简单的可用镜像 背景 之前的镜像, 都是 命令教程 类的 这次我想构建一个 可以用的 简单镜像镜像 1. 环境 os centos7 docker 18.09 docker image ja ...
- 2019牛客多校第四场A meeting 思维
meeting 题意 一个树上有若干点上有人,找出一个集合点,使得所有人都到达这个点的时间最短(无碰撞) 思路 就是找树的直径,找直径的时候记得要找有人的点 #include<bits/stdc ...
- Attribute "resultType" must be declared for element type "update" or "insert"
仔细查看错误如图所示: 解决错误就是把resultType去掉,因为在insert和update语句中是没有返回值的.小坑小坑 转自:https://blog.csdn.net/u013144287/ ...
- django入门与实践(开)
1.什么是Django? 基于python的高级web开发框架 高效 快速 免费 开源 正常上网流程 浏览器浏览网页的基本原理 请求响应过程 开发环境搭建 Python Django pip inst ...
- Qt5 error LNK2019 无法解析的外部符号的解决办法
今天在使用Qt Create 4.5.2时遇到一个莫名其妙的问题: 在原有工程里添加一个新类(有界面的),在调用的mainwindow.cpp中添加#include "a.h",然 ...
- Spring Boot 升级框架版本 Spring 5.2 Invalid argument syntax org.springframework.core.env.Simple CommandLineArgs
Invalid argument syntax org.springframework.core.env.Simple CommandLineArgs Parser.parse 具体问题应该是启动的c ...
- 概率dp 期望 逆推
题目大意: 从起点0点开始到达点n,通过每次掷色子前进,可扔出1,2,3,4,5,6这6种情况,扔到几前进几,当然对应飞行通道可以通过x直达一点y,x<y,计算到达n点或超过n 点要扔色子的次数 ...
- [爬坑记录] Qt 代码卡住 不发信号 不触发槽
先让我激动一会儿 [捂脸] 最近在用Qt做个程序 用来参加比赛 期间总共遇到两次如标题的问题 也即是 莫名其妙的不触发槽函数了 而且原因也不一样 {先说明 我学习Qt依旧只是入门级 也许入不了大佬法眼 ...
- 508,css优先级算法如何计算?
优先级就近原则,同权情况下样式定义最近者为准 载入样式以最后载入的定位为准 优先级:!important>id > class >tag; !important比内联优先级高 (百 ...
- [转]使用HttpOnly提升Cookie安全性
原文:https://www.cnblogs.com/zlhff/p/5477943.html 在介绍HttpOnly之前,我想跟大家聊聊Cookie及XSS. 随着B/S的普及,我们平时上网都是依赖 ...