js的特点
解释性语言 (不需要编译成文件 , 跨平台)
单线程 (同一时间只能做一件事)
编译性语言 c c++
优点:快
缺点:移植性不好(不跨平台)
解释性语言 javascript php
优点:跨平台**
缺点:稍微慢
JavaScript运行三部曲
语法分析
预编译
-函数声明 整体提升
-变量 声明提升
解释执行
1.暗示全局变量:即任何变量,如果未经声明就赋值,此变量就为全局对象所有。
2.一切声明的全局变量,全是window的属性(window就是全局的域)
预编译的四个步骤
-预编译发生在函数执行的前一刻
1.创建AO(Activation Object)对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一(实参赋值给形参)
4.在函数体里面找函数声明,值赋予函数体(也就是将函数声明赋值给这个函数声明的名字)
经验1:如果函数体里面有重名的变量和函数,第一个打印的是重名的,那么一定打印的是函数
function bar() {
return foo;
foo =10;
function foo() {}
var foo =11;
}
console.log(bar());
经验2:如果函数体里面有重名的变量和函数,最后一个打印的是重名的,那么打印的前一行是什么打印出来就是什么
console.log(bar());
function bar() {
foo =10;
function foo() {}
var foo =11;
return foo;
}
原型
原型是一个共有祖先,是该构造函数构造出对象的共有祖先。
构造函数
Person.prototype.LastName = 'wang';
//prototype 是函数的一个属性,并且是函数的原型对象
每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时, 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype, 于是就这样一直找下去,也就是我们平时所说的原型链的概念。
function Person(){
}
var person = new Person();
谈谈This对象的理解。
1. this总是指向函数的直接调用者;
2. 如果有new关键字,this指向new出来的那个对象;
3. 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;
Call和apply的区别
作用:都是改变this指向
区别:传参列表不同
call() 方法与 apply() 方法的作用相同,它们的区别仅在于接收参数的方式不同。apply接收一个运行函数的作用域,另一个是数组array,也可以是arguments对象。call() 方法时,传递给函数的参数必须逐个列举出来。
更简单地说,apply和call功能一样,只是传入的参数列表形式不同:如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])
异步加载js
1.defer异步加载,但要等到dom文档全部解析完才会被执行(只有IE能用)
2.async 异步加载,加载完就执行,async只能加载外部脚本,不能卸载script标签里.
3.创建script标签,插入到DOM中,加载完毕后callback
function loadScript(url,callback) {
var script = document.createElement('script');
script.type ='text/javascript';
if(script.readyState){
script.onreadystatechange =function () { //IE
if(script.readyState =="complete" || script.readyState =="loaded"){
eval(callback);
}
}
}else {
script.onload =function () { //safari chrome firefox opera
eval(callback);
}
}
script.src = url;
document.head.appendChild(script);
}
loadScript('文件路径','函数调用')