本文目录一览:
js为什么for in可以用const
const的特点是在块级作用域内不能重复声明,且不能给它重新赋值(重点是块级作用域)。for in的每一次循环都是一个块级作用域,所以可以使用for(const a in b)的形式去遍历对象的。但是在for循环内不可给c重新赋值。
let和const的引入会对js编程带来哪些改变
1. let 命令
① 在js中是没有块级作用域的,var 声明的变量作用域是整个函数体,而let可以起到这一作用
{ let a = 1; var b = 2; } console.log(b); // 2 console.log(a); // a is not defind
② 而let可以起到这一作用啊在js中变量和函数的声明会提升到当前作用域最顶部执行。这样就会出现问题。
var a = []; //函数和变量i会最先进行声明,同时全局变量i经过for循环赋值为10 for (var i = 0; i 10; i++) { a[i] = function () { console.log(i); }; } console.log(i);//10 a[6]();//10
而使用let就解决了这个问题
for (let i = 0; i 10; i++) { a[i] = function () { console.log(i); }; } a[6](); //6
③ let不像var那样,会发生“变量提升”现象
console.log(a); // a is not defined let a = 1;
④ let不允许在相同块级作用域内,重复声明同一个变量
// 报错 { let a = 10; var a = 1; } // 报错 { let a = 10; let a = 1; }
2. const 命令
① const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。
② 与let相同也不能在相同块级作用域内重复声明同一个变量。
③ const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const PI = 3.1415; console.log(PI); // 3.1415 //PI = 3; // Assignment to constant variable.(不能给常量赋值) //const PI = 3.1;// Identifier 'PI' has already been declared
js全局和局部的作用域
楼下说的不对吧!
首先:第一个,第一行定义了一个全局的var01,再在方法里定义了一个var01,首先搞清楚什么是var ,这是个变量声明关键字,他出现在哪和你全局不全局没有任何关系!
第一个之所以undefind是因为你将一个变量名定义两次,这个是不允许的,undefind在这里本质是声明错误,内存中不存在,即声明时发生错误,内存没有记录!不存在的东西js统一报错undefind!
第二个:输出1,是因为,js是脚本语言,在执行时按照顺序加载,当执行到write时,var01的值是1,此时还没执行到var01=0,这一步,所以先到先得,取出为1,然后在将var01赋值为0,但是此前js就已经输出了,所以0不会被输出!
关于全局和非全局,等你做久了你其实会发现,把全局叫做作用域会更好,他作用于谁,取决于你在何处声明(var关键字),比如你在页面的js第一行就写一个var var01,那这个var01就只作用于这个页面,那我是不是可以理解,所谓全局是整个程序,那我虽然定义了一个var,却不能延伸到整个程序,那我是不是就可以推翻这个var看起来像全局,但在我的语境中其实并非全局,他只是我这个页面的全局,对于我整个程序来说,这个页面又是个局部!所以用作用域来解释会更好!
如果确实需要区分的话,那你可以这样理解
根据js 的执行顺序是逐行执行的特点,那么在js中,首先出现的var就是全局(顺带一提,function某种程度上等同var,再此与var并论!)所以简单理解就是,方法体外的var都是这个js的全局,方法体内的都是这个方法体的全局(你没听错,是这个方法体的全局!!!!!),但是,方法体是js 的全局,方法体内的var是方法的全局,而var var01的作用域又限定为方法体,所以,方法体内的var相对于js来说只能是局部.
其实这还漏了一个知识点:叫做,方法私有属性,即:方法体内定义的任何属性和方法都只归其父方法所有!!!!!
理解:某个页面的js文件理解为一个大方法,这个方法里又有其他方法,而子方法里的属性因为只归其父,所以父方法的父方法无权调用,父父方法若要调用只有通知其子方法,让子方法通知其子属性并暴露给其父父方法!
但愿你听懂了,哈利路亚!自己都绕了