php变量 声明提升,TypeScript:let和const变量声明

在开始介绍let和const变量声明前,有必要先了解下JavaScript里的var变量声明。

var变量声明

全局声明

var声明在函数体外,所声明的变量为全局变量。var name = "张三";

var所声明的全局变量会作为window的一个属性,可以使用"."来引用。如上例的name引用:console.log(window.name)

注意:非严格模式下,声明在函数体内的变量,把声明语句的var去掉,那么所声明的变量也是全局变量。

作用域

var变量声明的最大特点是它的作用域为声明语句所在的最近函数体内。

示例:function f() {

var message = "Hello, world!";

return message;

}

var所声明的message变量的作用域范围就是在函数f内。

var声明变量的作用域为函数体的全部,隐含着两个主要问题:变量提升和循环内变量共享。

变量提升

变量提升:JavaScript会把函数内的变量声明提升到函数的最顶部。

示例:function(){

var a='a';

var b='b';

var c='c';

}

等同于function(){

var a,b,c;

a='a';

b='b';

c='c';

}

这样看是貌似没有问题,想一下下面的例子输出结果:var message='message 1';

(function(){

console.log(message)

var message ='message 2';

})()

很多人可能会认为控制台输出的结果是message 1。执行一下会发现,输出的结果为undefined。这是因为变量提升了。

上面的例子实际等同于var message='message 1';

(function(){

var message;

console.log(message)

message ='message 2';

})()

变量提升有它的优势,但也常常给我们带来一些难以发现的bug。

循环内变量共享

直接看示例:for (var i = 0; i 

setTimeout(function() { console.log(i); }, 100 * i);

}

我们期待的输出结果为依次为0,1,2,3,4,5,6,7,8,9,而实际输出结果都为10。这是因为在循环内共享了变量i,i自增到10结束setTimeOut()里的函数还没有调用,当调用函数时,i值为10,所以输出的结果都为10。

为了解决循环内变量共享,可以考虑使用IIFE。for (var i = 0; i 

(function(i) {

setTimeout(function() { console.log(i); }, 100 * i);

})(i);

}

重复声明

在上面的例子var message='message 1';

(function(){

console.log(message)

var message ='message 2';

})()

message是允许重复声明的,重复声明的变量会覆盖之前声明的变量。

let变量声明

let是ES6新增的特性,也是为了解决var变量声明所存在的一些问题,可以说let是更完美的var。

基本用法

let varName = 变量值;

示例:let name = "张三";

这是和var声明变量类似。

注意:如果let变量声明在全局,它并不会像var声明的变量一样成为window的一个属性。

作用域

let变量声明和var最大的不同点就是变量的作用域不一样。var为函数作用域,而let变量声明的为块作用域(block-scoping)。

块作用域会把声明的变量限定在代码块(如使用{}括起来的代码库)或者for循环内,而不是整个函数体。function f(input: boolean) {

let a = 100;

if (input) {

let b = a + 1;

return b;

}

// 出错: 'b'属于上面的代码块定义的,在代码块外不能使用。

return b;

}

let声明的变量不允许在声明前使用,这样解决了var变量提升引起的问题。(function(){

console.log(message);    //此处会报错,Uncaught ReferenceError: message is not defined

let message ='my message';

})()

对于循环内的变量,每次循环都会是捕获值的副本作为运算,而不是共享同一个值,解决了var循环内共享变量的问题。所以前面for循环的例子只需把var改为let即可:for (let i = 0; i 

setTimeout(function() { console.log(i); }, 100 * i);

}

重复声明

let是不允许在同一作用域内重复声明,重复声明会报error: can't re-declare 'x' in the same scope。function f(x) {

let x = 100; // error: interferes with parameter declaration

}

function g() {

let x = 100;

var x = 100; // error: can't have both declarations of 'x'

}

const变量声明

const变量声明和let类似,但如它的名字所寓意,它定义的是常量,包含了两层意思:声明的的变量不能被重复赋值

const声明变量是必须立刻赋值const numLivesForCat = 9;

numLivesForCat = 10;  //重复赋值,错误

const name;  //错误,声明时没有赋值

name = "张三";

对于const声明的对象,对象本身是不能被赋值覆盖,但是对象的可修改属性是允许被修改值的。const numLivesForCat = 9;

const kitty = {

name: "Aurora",

numLives: numLivesForCat,

}

// Error

kitty = {

name: "Danielle",

numLives: numLivesForCat

};

// all "okay"

kitty.name = "Rory";

kitty.name = "Kitty";

kitty.name = "Cat";

kitty.numLives--;

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

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

相关文章

面向切面编程应用_应用面向方面的编程

面向切面编程应用1.引言 面向方面编程的主要目标是将跨领域关注点分离。 当我们谈论跨领域的关注时,我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括: 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将…

【渝粤题库】陕西师范大学201541 合同法作业

《合同法》作业 一、单项选择题 李某将自己房屋租给张某使用,租给一段时间后,双方经过商议达成房屋买卖合同,则该房屋的所有权发生转移的特别生效要件是下列哪种行为? A.占有改定 B.简易交付 C.登记 D.公证 2.甲念高三…

php 字符串索引值,PHP:字符串索引不一致?

我创建了一个函数,该函数从硬编码的单词列表中随机生成一个短语.我有一个函数get_words(),该函数具有一串硬编码的单词,将其转换成一个数组,然后重新排列并返回.get_words()由generate_random_phrase()调用,它会反复遍历get_words()n次,并且在每次迭代时,将n个单词连接到最终的…

【渝粤题库】陕西师范大学202013 民法专论 作业

《民法专论》作业 一、单选题 1、为了保护民事主体的合法权益,调整民事关系,维护社会和经济秩序,适应 ,弘扬社会主义核心价值观,根据宪法,制定本法。下划线处应填(  ) A. 社会主义…

使用JUnit5对DynamoDB应用程序进行单元测试

在之前的文章中,我描述了新的Java 2 AWS SDK,它为调用不同AWS服务的Java客户端提供了非阻塞IO支持。 在本文中,我将介绍一种用于单元测试AWS DynamoDB调用的方法。 有几种方法可以启动DynamoDB的本地版本– 1. AWS提供了一个DynamoDB本地 …

【渝粤题库】陕西师范大学202421 教育管理心理学 作业 (专升本)

《教育管理心理学》作业 一、名词解释 人际知觉 2.态度 3.内化 4.社会知觉角色知觉 6.晕轮效应 7.激励因素 8.经济人退化 10.首因效应 11.激励 12.需要 13.保健因素 14. 挫折 15.制…

centos 安装php扩展gd,linux(centos)下为php添加添加GD扩展

yum -y install libjpeglibjpeg-devel libpng libpng-devel freetype freetype-devel 安装依赖库yum -y install libjpeg-devel1.首先切换到php源码目录:/usr/local/php-5.6.29/ext/gd2.利用phpize生成gd扩展文件,/usr/local/php/bin/mipsel-linux-phpize, ls 或者 …

【渝粤题库】陕西师范大学209013 计量经济学 作业

一、名词解释 1.偏回归系数 2.异方差性 3.虚拟变量 4.间接最小二乘法 5.调整的多元可决系数 6.序列相关性 7.滞后变量 8.行为方程 9.受约束回归 10.多重共线…

【渝粤题库】陕西师范大学210023 学前儿童社会教育 作业(专升本)

《学前儿童社会教育》作业 一、单选题 1.我国有关儿童社会性发展研究得到迅速发展的年代是( ) A.20世纪30年代 B.20世纪70年代 C.20世纪80年代 D..20世纪90年代 2.安斯沃思将婴幼儿的…

php numeric乘法,PHP is_numeric()用法及代码示例

is_numeric()函数是PHP中的内置函数,用于检查传入函数中作为参数的变量是数字还是数字字符串。该函数返回一个布尔值。用法:bool is_numeric ( $var )参数:该函数接受一个必须的单个参数,如下所述:$var:此输入参数是变量&#xff…

【渝粤题库】陕西师范大学292161社会保障概论 作业(专升本)

《社会保障概论》作业 一、填空题 1、英国政府于1601年颁布了 ,标志着社会保障制度的萌芽。 2、 是社会保障制度的核心部分, 是社会保障的最高层次; 是社会保障最后一道防线。 3、就业保障制度包括: 、 、 三方面内容。 4、工伤保…

jooq权限配置_将jOOQ与Spring结合使用:配置

jooq权限配置我遇到了由ORM引起的性能问题。 尽管我不得不承认大多数这些问题确实是由您造成的,但是我开始认为在只读操作中使用ORM是不值得的。 我开始寻找实现这些操作的替代方法。 这就是我遇到jOOQ的方式 ,它指出: jOOQ从您的数据库生…

【渝粤题库】陕西师范大学600001物理化学(上) 作业(专升本)

《物理化学(上)》作业 一.单选题 1.下列物理量中属于强度性质的是 A. H B. S C. p D. G 2.298.2K时,1mol的氧气(可视为理想气体)经等温可逆膨胀后,体积胀大10倍,对于该过程来说, 其Δ…

employee.java,Java基础系列(六):对象与类(上)

概述类(class)是构造对象的模板。由类构造对象的过程称为创建类的实例。封装从形式上看,封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,而操纵数据的过程称之为方法。对于每个特定的类实例…

【渝粤题库】陕西师范大学800007 地理信息系统

《地理信息系统》作业 一.名词解释 1.TIN       2 .缓冲区分析 3.元数据 4. 地理信息系统 5.空间数据库  6.拓扑关系 7.矢量结…

国家开放大学2021春1080工程数学(本)题目

教育 教育 试卷代号: 1080 2021年春季学期期末统一考试 工程数学(本) 试题 2021年7月 一、单项选择题(每小题3分,共15分) 1.设方阵可逆,则下列命题中不正确的是( ). A. B.线性方程组必有非零解…

弹簧启动执行器教程

朋友您好,在本教程中,我们将学习弹簧执行器及其所有功能。 1.什么是弹簧执行器? 2.如何在Maven项目或Gradle项目中添加弹簧执行器? 3.创建一个具有Spring Actuator依赖项的Spring Boot项目。 4.使用弹簧执行器端点监视应用程序…

matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列

更新:我做了一些测试,Jonas的解决方案对于一系列不同大小的输入向量来说是最快的.特别是,正如angainor指出的那样,解决方案可以很好地扩展到大尺寸 – 这是一个重要的测试,因为通常是大尺寸的问题促使我们在SO上提出这些问题.感谢Jonas和tmpearce的解决方案 – 基于…

matlab 里try用法,matlab在整个程序(全局)中使用try-catch来报告错误

我的matlab程序是一个多窗口程序化GUI。我已经实现了一个报告系统,所以当遇到错误时,它会调用我编写的函数generateReport.m,它发送一个带有一些日志和状态信息的电子邮件,然后继续执行。为了实现这一点,我在每个单独的…

【渝粤题库】陕西师范大学200741概率论与数理统计作业(高起本、专升本)

《概率论与数理统计》作业 一、填空题 1.设有两门高射炮,每一门击中飞机的概率都是0.6,则同时发射一发炮弹而击中飞机的概率为   .若有一架敌机入侵领空,欲以99%以上的概率及中它,至少需 __&…