九联科技笔试总结
尽管自己看上去每天都在做一些东西,但还是感觉很虚。拿今天的笔试题来说吧,很多都是基础的知识点,但还是答的不够好。现
在做一个总结,也顺带复习一下之前学的内容。不管怎么样,有些细节还是需要多注意(今天笔试时,字写得的确是太丑了)。
自定义一个对象(共有方法,私有方法)
工厂模式
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内存泄漏的原因
- 全局变量
function foo(arg) {
bar = 'text';
}
//等同于
function foo(arg) {
window.bar = 'text';
}
- 闭包()
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
跨域问题
跨域: 浏览器不能执行其他网站的脚本 ->原因:同源策略(协议,域名,端口)
- jsonp实现跨域的原理
利用script标签支持跨域的属性,用script标签拿到包裹数据的方法(相当于返回了一段js代码),在请求中包含callback,服务端注入参数后返回这个回调函数,然后用script标签拿到返回的js代码跨域直接运行回调 - nginx反向代理
- node.js中间件代理跨域
- CORS