变量,作用域

基本数据类型:(五种)

Undefined、 Null、Boolean、Number、String。

引用类型:

Object

异同:

       在复制的时候都会重新复制一个副本,然后再复制给其他变量

不同:

       对于基本数据的类型,复制后,参与任何操作不会受到影响,而引用类型的复制,引用类型的副本实际是一个指针,指向一个堆栈中的对象,当复制后,他们都同指向的同一个对象,所以改变其中一个的值,会影响另外一个的值

var obj1 = new Object;
	obj1.name = 'zl';
	var obj2 = obj1;
	obj2.age = 5;
	obj2.name ='zz';
	console.log(obj1);

作用域:

     块级作用域

      首先明确一点,JavaScript不同于c/c++,它没有块级作用域,什么叫块级作用域呢,在这里给大家举个例子

var sum=0;
for(var i = 0; i< 10; i++)
   {
      sum+=i
   }
console.log(i);//i=10
     作用域链

      书上是这样写的,作用域是保证对执行环境有权访问的所有变量和函数的有序访问。,作用域链的前端,始终都是当前执行的代码所在环境的变量对象。全局执行环境的变量对象始终所示作用域链的最后一个对象。

     对于我来说,作用域链就是告诉了我,我可以访问到哪些变量或者函数,而到底我能访问到哪些变量和函数呢?这里来给大家举一个例子

 var color = 'red';
   function changeColor1 ()
	{
		color = "blur";
		return color;
	}
	function changColor2 ()
	{
		console.log(color);//undefined
		var color = 'yellow';
		return color;
	}
	console.log(color);//red
	console.log (changeColor1());//blue
	console.log(color);//blue
	console.log(changColor2());//yellow
	console.log(color);//blue

     可以发现的是①.寻找变量的时候,从自身作用域开始寻找,如果自身没有,就往上找,这个上呢指的不是随便什么上面都可以,而是说必须是你的父级函数,或者再父级的父级。而不能往下去找,如果找不到,当然会是undefined。可是问题来了,为什么上面代码中,第二个函数里打印的是undefined?这里又得提到一个东西,叫做变量的提升

变量的提升指的是 函数及变量的声明都将被提升到函数的最顶部,其实在changeColor2中,虽然我们打印值放在了 var color = 'yellow';的前面,但是进入函数并不是按顺序执行的哦,他会先定义函数里的变量,比如这里的color会先被定义,然后赋初值为undefined,而var color = 'yellow'只是将color进行新的赋值而已。当然变量的提升也只是一个较为浅层次的说法,其实更深一步,我们得了解什么叫预编译
其实在脚本执行之前,我们的程序还经过了两个步骤,一个是语法分析,还有一个就是我们说的预编译。

语法分析是判断你的基本语法是否出现错误,然后给出相应的出错提示。

当程序开始运行使,页面会创建一个全局对象(Global Object)预编译在函数里开始查找变量的声明和函数的声明,如果找了变量的声明,那么这个变量将作为GO的属性,初值为undefined。而函数也将作为GO的属性,初值为函数体。所以大家应该会理解以下代码

 var color = 'red';
   function changeColor1 ()
	{       console.log(color);//undefined
		var color = "blur";
		console.log(color);//blur
	}
	function changeColor2 ()
	{
		var color = 'yellow';
		var color = function ()
		{
		}
		console.log(color)//ƒ (){}
	}
	changeColor1();
	changeColor2();





参考资料:JavaScript高级程序设计书 

猜你喜欢

转载自blog.csdn.net/weixin_40518538/article/details/80669535