一、你做过的网页在哪些浏览器测试过,这些浏览器的内核是什么?
浏览器的内核分为两大部分,一是渲染引擎,另一个是js引擎 ,现在js引擎比较独立,内核更加倾向于渲染引擎。
五大浏览器内核及其代表:
1、 Trident内核:其代表作品是IE,因为IE捆绑在Windows中,占有极高的份额,又称IE内核。此内核只能用于Windows平台,且不是开源的。
——其代表作品还有腾讯、360浏览器等
2、 Gecko内核:代表作品是Firefox,即火狐浏览器,它是开源的,最大的优势是跨平台的,在Windows、Linux、macOS等主要操作系统中使用。
3、 webkit内核:代表作品是Safari、曾经的chrome,是开源的项目。
4、 Presto内核:代表作品是Opera,在13年之后,Opera宣布加入谷歌阵营,弃用了Presto
4、 Blink内核:由Google 和Opera software开发的浏览器排版引擎,现在 的chrome内核是Blink。
css3兼容各版本浏览器前缀
前缀 | 浏览器 |
---|---|
-webkit- | chrome、safari |
-moz- | firefox |
-ms- | IE |
-o- | opera |
二、函数声明和函数表达式的区别?
在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数声明或者使用函数表达式。
函数声明:
count(); //函数声明在JS解析时进行函数提升,正常运行
function count(a,b){
return a+b;
}
函数表达式:
count();//在函数表达式之前调用函数,报错,因为这时候还没有count这个变量;
var count=function(a+b){
return a+b;
}
区别:
函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
三、 js apply()的使用详解,它与call()的区别?
apply定义: 能劫持另一个对象的方法,继承另一个对象的属性。
function.apply ( obj , args ) 方法能接收两个参数
- obj : 这个对象将代替function类里的this对象
- args : 这个是数组,它将作为参数传给function
-
call和apply的意思一样,只不过参数列表不一样。
apply示例:
<script>
//定义一个人类
function Person(name,age){
this.name=name;
this.age=age;
}
//定义一个学生类
function Student(name,age,grade){
Person.apply(this,argument);
this.grade=grade;
}
//创建一个学生类
var student=new Student("fan",22,"一年级");
//测试
alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student+"\n");
</script>
call示例:
<script>
//定义一个人类
function Person(name,age){
this.name=name;
this.age=age;
}
//定义一个学生类
function Student(name,age,grade){
Person.call(this,name,age); //与Apply的差别
this.grade=grade;
}
//创建一个学生类
var student=new Student("fan",22,"一年级");
//测试
alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student+"\n");
</script>
三、 js闭包的理解及用途
首先来看一个闭包demo:
function A(){
function B(){
console.log("Hello world");
}
return B;
}
var C=A();
C();//Hello wprld
有了初步认识后,我们简单分析一下它和普通函数有什么不同,上面代码翻译成自然语言如下:
(1)定义普通函数 A
(2)在 A 中定义普通函数 B
(3)在 A 中返回 B
(4)执行 A, 并把 A 的返回结果赋值给变量 C
(5)执行 C
把这5步操作总结成一句话就是:
函数A的内部函数B被函数A外的一个变量 c 引用。
把这句话再加工一下就变成了闭包的定义:
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
因此,当你执行上述5步操作时,就已经定义了一个闭包!
闭包的用途:
首先了解一个知识点:
在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC (垃圾回收机制)回收,否则这个对象一直会保存在内存中。
在上述例子中,B定义在A中,因此B依赖于A,而外部变量C又引用了B,所以A间接的被C引用。也就是说A不会被GC回收,会一直保存 在内存中。为了证明我们的推理,上面的例子稍作改进:
function A(){
var count=0;
function B(){
count++;
console.log(count);
}
return;
}
var C = A();
C();// 1
C();// 2
C();// 3
所以当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。
以上只是对闭包的最简单的理解,它还有更深层次的理解。