JavaScript的变量、作用域

基本类型和引用类型的值

1.1 动态的属性
不能给基本类型的值添加属性

var name = "Sunshine";
name.age = 27;
alertname.age);	  //undefined

    为字符串name定义了一个名为age的属性,并为其赋值27。但是访问时发现该属性不见了。这说明只能给引用类型之动态的添加属性
1.2 赋值变量值
    基本类型:复制后两个变量可以参与任何操作且不会互相影响。
    引用类型:复制后两个变量引用同一个对象,一个改变另一个也随之改变。

//引用类型的例子
var obj1 = new Object();
var obj2=obj1;
obj1.name = "Sunshine";
alert(obj2.name);		//"Sunshine"

变量obj1实例化了一个新对象,然后这个值被复制到obj2中,此时obj1和obj2都指向同一个对象。可以说,obj1的name属性,可以通过obj2来访问,因为两个变量引用同一个对象。
1.3 传递参数
参数传递有两个类型:基本类型引用类型
    ECMAScript中所有函数都是按值传递的。基本类型的值传递是值被复制,而引用类型的传递是内存地址被复制。

function setName(obj){
	obj.name = "Sunshine";
}
var person = new Object();
setName(person);
alert(person.name);		//"Sunshine"

    在这个函数内部,obj和person引用同一个对象,即使这个对象是按值传递的。党在函数内部为obj添加name属性后,函数外部的person也有反应。person指向的对象在堆内存中只有一个,且是全局对象。
    对于一个在函数外部定义的全局变量来说,即使在函数内部重写了参数,并修改了参数的值,但原始的引用仍然保持不变。这个重写的参数变量引用就是局部对象,会在函数执行完毕后立即被销毁。
1.4 检测类型
    检测类型用的值时,ECMAScript提供了instanceof操作符。
语法:

result = variable instanceof constructor;

含义是:variable是constructor吗?

执行环境及作用域(重点来了!)

    全局执行环境是最外围的执行环境。
    全局变量和函数是作为window对象属性和方法创建。
    每个函数都有自己的执行环境。
2.1 作用域链
    作用域链的用途:保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终都是当前执行的代码所在环境的变量对象。
    函数内部的变量在外部也访问不到。
    简单来说,当查询变量和函数时,里面的环境可以访问外面的环境;但是反过来,就不可以了!
2.2 延长作用域链
    当执行流进入try-catch的catch块,with语句会加长作用域链。他们都会在作用域链的前段添加一个变量对象
2.3 没有块级作用域
    if语句定义的变量会被添加到当前的执行环境中。
    由for语句创建的变量即使在for循环执行结束后,也依旧存在与循环外部的执行环境中。
2.3.1 声明变量
        使用var声明的变量会自动被添加到最接近的环境中。
        如果初始化时未使用var声明,则该变量会自动被添加到全局环境中。
变量一定要先声明!!!!!
2.3.2 查询标识符
        搜索过程从内到外,逐级查询与给定名字匹配的标识符。
        如果局部环境中存在同名标识符,就不会使用位于父环境中的标识符。
        任何位于局部变量p声明之后的代码,如果不用window.p,都无法访问到全局变量p。
如下述代码:

var p=1;
function t1(){
	alert(p);
	alert(window.p);
	var p=5;
	alert(p);
	var p=2;
	alert(p);
}
t1();
alert(p);		//undefined	1	5	2	1

    这部分代码,说明在t1()中第一个alert(p);引用不到外部的全局变量p;而alert(window.p);引用的则是全局变量p;第二个alert(p);则是对刚刚声明的局部变量p的一个引用;第三个alert(p);同第二个;最后,全局环境下的alert(p);则是引用全局环境下的p,因为在外部访问不到函数内部,即局部环境内的变量。
2.3.3 垃圾收集(辣鸡!)
        执行环境会负责管理代码执行过程中使用的内存。
        原理:找出不再继续使用的变量,释放其占用内存。垃圾收集器会周期性地执行这一操作。
    (1)最常见的方式是标记清除(可使用任何方式标记变量,被标记的变量将被视为准备删除的变量),不常见的方式是引用计数(跟踪记录每个值被引用的次数)。
    (2)性能问题
    (3)管理内存

问题回答:
    1.全局变量和局部变量的定义?
    答:
        全局变量在全局环境直接var或是在函数内部不var,直接声明。
        局部变量即是在函数内部var声明。
    2.for里面声明的变量出来能用吗?
    答:能。
    3.用什么区分作用域?
    答:我的理解是全局环境(最外层的环境)和局部环境(函数体内的环境),没有块级作用域。(如果不对我明天更正)
    4.内部怎么访问全局变量?
    答:window.变量名。
    5.浏览器怎么解析html文件?(这题我是百度的)
    答:
        link里面的css文件是并行请求下载的
        script里面的js文件是同步请求下载的
        html页面中的语句都是从上往下执行的
        浏览器是同步加载 JavaScript 脚本,即渲染引擎遇到defer是“渲染完再执行”,async是“下载完就执行”,两者都是先下载,只是执行时间不同
        如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async脚本是不能保证加载顺序的
        开始先下载html,渲染dom文档,然后根据css渲染dom。link里面的css文件是并行请求的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值