九联科技笔试总结

Author Avatar
Silas Shen 3月 15, 2018

尽管自己看上去每天都在做一些东西,但还是感觉很虚。拿今天的笔试题来说吧,很多都是基础的知识点,但还是答的不够好。现
在做一个总结,也顺带复习一下之前学的内容。不管怎么样,有些细节还是需要多注意(今天笔试时,字写得的确是太丑了)。

自定义一个对象(共有方法,私有方法)

工厂模式

function person() {
    var o = new Object();
    o.name = 'shen';
    o.say = function() {
        alert(this.name);
    }
    return o;
}
var person1 = person();  
  • 优点:返回了一个对象
  • 缺点:无法通过constructor识别对象,且每次通过Person创建对象时,say()都是一样的

构造函数模式

function Person() {
    this.name = 'shen';
    this.say = function() {
        alert(this.name);
    }
}
var person1 = new Person();
  • 优点:通过constructor或instanceof可以识别对象实例的类别
  • 缺点:多个实例的say()方法都是实现一样的效果,但却存储了多次

原型模式

function Person() {}
Person.prototype.name = 'shen';
Person.prototype.say = function() {
    alert(this.name);
}
Person.prototype.friends = ['dan'];
var person1 = new Person();
  • say()方法是共享的,所有实例的say()指向同一个
  • 可以动态地添加原型对象的方法和属性,并反映在对象实例上
var person1 = new Person()
Person.prototype.showFriends = function() {
    console.log(this.friends)
}
person1.showFriends(); //['dan']

构造函数和原型组合模式

function Person(name) {
    this.name = name;
    this.friends = ['dan'];
} 
Person.prototype.say = function() {
    console.log(this.name);
}
var person1 = new Person('shen');
person1.say(); //shen

闭包

闭包:有权访问另一个函数作用域中变量的函数

产生闭包

function func() {
    // 创造局部变量
    var a=1, b=2;
    function closure() {
        return a+b;
    }
    // 让func中能访问到closure
    return closure;
}

闭包的应用

任何在函数中定义的变量,都可以认为是私有变量
特权方法:有权访问私有变量的共有方法

function Animal() {
    var series = "哺乳动物";//私有变量
    function run() {
        console.log("run");
    }

    //特权方法
    this.getSeries = function() {
        return series;
    };
}

this的指向

this最终指向的是那个调用它的对象(只有在函数执行的时候才能确定)
如果返回值是一个对象,那么this指向的就是那个返回值对象,如果返回值不是一个对象,那么this还是指向函数的实例

js内存泄漏的原因

  1. 全局变量
function foo(arg) {
    bar = 'text';
}
//等同于
function foo(arg) {
    window.bar = 'text';
}
  1. 闭包()
var theThing = null;
var replaceThing = function() {
    var originalThing = theThing;
    var unused = function() {
        if (orginalThing)
        console.log('hi')
    };
}

js同步和异步

异步任务:主线程(stack栈)运行过程中,当stack空闲的时候,主线程对event queue轮询后,将异步任务放到stack中执行

定时器

setTimeout和setInterval的区别

setTimeout(function Set(){
    console.log("setTimeout");
    setTimeout(Set,10);
},10);                            //等前一个callback执行完,延迟10ms执行回调函数
setInterval(function(){
    console.log("setInterval");
},10);                           //每隔10ms执行回调函数,不管上一个是否执行完
var a = 10;
function A() {
    console.log(a);  //1.undefined
    var a = 20;
    console.log(a);  //2.输出20
    for (var a=0; a<5; a++) {
        setTimeout(function() {
            console.log(a);  //4.每隔一秒输出一个5(5*5)
        },1000*a)
    }
}
A();
console.log(a);  //3.输出10

跨域问题

跨域: 浏览器不能执行其他网站的脚本 ->原因:同源策略(协议,域名,端口)

  1. jsonp实现跨域的原理
    利用script标签支持跨域的属性,用script标签拿到包裹数据的方法(相当于返回了一段js代码),在请求中包含callback,服务端注入参数后返回这个回调函数,然后用script标签拿到返回的js代码跨域直接运行回调
  2. nginx反向代理
  3. node.js中间件代理跨域
  4. CORS