基本类型和引用类型的值
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文件是并行请求的。