前端面试知识整理-2017年7月10日

本文详细介绍了浏览器内核原理、函数声明与表达式的区别、apply与call的使用及闭包的概念与应用,帮助读者深入理解前端核心知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、你做过的网页在哪些浏览器测试过,这些浏览器的内核是什么?

浏览器的内核分为两大部分,一是渲染引擎,另一个是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

所以当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。

以上只是对闭包的最简单的理解,它还有更深层次的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值