变量函数申明随笔

块级作用域 、变量提升、暂时性死区、不可重复申明

let t
var t
//error

var t=1;
console.log(window.t);
// 1

let t=1;
console.log(window.t)
//undefined   let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

let t;
{
	var t
}
//error

var t=1;
{
	let t=2
	console.log(t)
}
// 1


console.log(t)
let t
//error 

console.log(t)
//error

typeof t
//undefined

console.log(t)
var t=1
//undefined

var t=1;
function(){
	console.log(i)
	var t=1
}
//undefined

var t=1;
(function(){
	console.log(i)
	let t=1
})()
//error


let t=1;
(function(){
	console.log(i)
	var t=1
})()
//undefined


var t=[]
for(var i=0;i<10;i++){
		t[i]=function(){
			console.log(i)
		}
	}
t[0]();t[9]();
console.log(i)
// 10  10
//10


var t=[]
for(let i=0;i<10;i++){
	t[i]=function(){
		console.log(i)
	}
}
t[0]();t[9]();
// 0 9


for(let i=0;i<2;i++){
let i=5;
	console.log(i)
}
// 5 5  执行2次 而不是1次

函数申明相关
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。

t()
{
	function t(){   console.log(1)  }
}
//error

{
	t()
	function t(){ console.log(1)}
}
//1

function t(){  console.log(1) }
{
		function t(){   console.log(2)  }
		function tt(){   console.log(3) }
		t()
}
t();tt()
//2 2 3


t();
function t(){  	console.log(1)  }
//1


t()
if(1){
	function t(){  console.log(1) }
}
// error


if(1){
	function t(){  console.log(1)  }
}
t()
//1

if(0){
	function t(){  console.log(1)  }
}
t()
//error


function t() { console.log('1'); }
(function () {
  if (0) {
    	function t() { 	console.log('2'); }
  }
	t();
}());
//error

'use strict';
if (1)  function t() {}
//error

常量

const a ;
//error

const a=1;
a=2;
//error

const t={x:1}
t.y=2
console.log(t)
// {x:1,y:2}
t={z:3}
//error

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。

猜你喜欢

转载自blog.csdn.net/weixin_42801813/article/details/89265337
今日推荐