JavaScript高级程序设计(3)

Ajax

技术的核心是XMLHttpRequest对象
XHR的用法,首先要调用的第一个方法是open(),它接受3个参数,包括要发送的请求类型,请求URL,是否采用异步发送请求。

xhr.open(“get”,URL,false);
调用open()方法不会真正发送请求,而只是启动了一个请求以备发送。

xhr.send() 该方法接收一个参数,即要发送的数据。如果不需要发送数据,则必须传入null,因为这个参数对浏览器是必须的。
由于是同步的,所以JavaScript代码会等到服务器响应后再执行。
响应数据会自动填充XHR对象的属性:

  • responseText 返回的主体文本
  • responseXML 响应数据的XML文档
  • status HTTP状态

我们经常还是要发送异步请求,让JavaScript继续执行,而不必等待响应,可以通过检测XHR对象的readyState属性,表明请求/响应过程的活动阶段

  • 0 还未调用open()
  • 1 启动,调用open()还未调用send()方法
  • 2 发送 已经调用send() 并未收到响应
  • 3 接收 接收到部分响应数据
  • 4 完成 已经接收到全部响应数据

readyState属性改变时会触发一次readystatechange事件

必须在调用open()前指定onreadystatechange事件处理程序,此时open方法里面的参数为true

HTTP头部信息

  • Accept:浏览器能处理的内容类型
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何cookie
  • Host:发出请求的页面所在域
  • Referer 发出请求页面的URL
    可以设置请求包头的信息
    xhr.setRequestHeader(“MyHeader”,”MyValue”);
    以上代码必须在open()之后,send()之前;
    GET从服务器获取数据
    POST向服务器提交数据

    与GET请求相比,POST请求消耗资源更多些,发送相同的数据,GET请求速度是POST请求的2倍

CORS(Cross-Origin Resource Sharing)跨域资源共享

其基本思想为使用自定义的HTTP头部让浏览器与服务器进行沟通。决定请求响应成功或失败。

其他跨域技术
上述第一种跨域请求技术是使用\标签,一个网页可以从任何网页中加载图像,不用担心跨域,动态创建图像Ping只能发送GET请求,而且无法访问服务器的响应文本,图像Ping只能用于浏览器与服务器的单向通信。

JSONP

是JSON with padding (填充式JSON 或参数式JSON)的简写,是包含在函数调用中的JSON
JSONP是由两部分组成:回调函数和数据
回调函数为响应到来时在页面调用的函数
数据是传入回调函数中的数据
http://xx.xx.xx/json/?callback=handleResponse
\元素与\元素类似,有能力不受限制地从其他域加载资源。
JSONP使用例子:

1
2
3
4
5
function handleResponse(response){
alert("You are at IP address" +response.ip +",which is "+response.city +"," +response.region_name);
var script =document.createElment("script");
script.src="http://xx.xx.xx/json/?callback=handleResponse";
document.body.insertBefore(script ,document.body.firstChild);

优点在于直接访问响应文本,支持浏览器与服务器间双向通信

Comet技术

一种服务器向页面推送数据的技术
适合处理体育比赛或者股票信息
两种实现Comet的方式:

  • 长轮询
  • HTTP流

JavaScript 高级程序设计(2)

闭包 Closjure

在函数内部定义了其他函数时,就创建了闭包

闭包是为了让函数内部访问外部作用域

当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存直到闭包不再存在。

闭包的例子:

1
2
3
4
5
6
7
8
9
function parent(){
   var m=50;
   function son(){
        alert(m);
   }
   return son;
}
var s=parent();//将结果保存在全局里
s();//50

this对象与闭包的关系:

每个函数在被调用时,其活动对象就会自动获得两个特殊变量:this和arguments,内部函数永远无法直接访问外部函数中的这两个变量,所以建议用闭包的方式去访问这两个变量

闭包引起的内存泄露问题,回收闭包中的内存问题:

用作块级作用域(私有作用域)的匿名函数语法:

1
2
3
(function(){
//模拟块级作用域
})();

前面圆括号里面是一个函数表达式,后面表示立即调用这个匿名函数。

javascript中的私有变量,函数中定义的变量,可以访问私有变量和私有函数的公共方法称为特权方法。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
function myObject(){
//私有变量和私有函数
var privateVariable =10;
function privateFunction(){
return false;
}
//特权方法
this.publicMethod=function(){
privateVariable++;
return privateFunction();
};
}

特权方法作为闭包有权访问在构造函数中定义的所有变量和函数,利用私有成员和特权方法,可以隐藏那些不该被直接修改的数据。

在原型上定义特权方法:
Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(function(){
var privateVariable =10;
function privateFunction(){
return false;
}
//构造函数
MyObject = function(){
};
//特权方法
MyObject.prototype.publicMethod = function(){
privateVariable++;
return privateFunction();
};
})();

上面代码中的私有变量和函数是由实例共享的。
即修改一个实例的变量会影响其他变量。

单例(Singleton)模式

只有一个实例的对象,单例一般作为全局对象存在。
以对象字面量的方式创建单例对象:

1
2
3
4
5
6
var singelton={
name:value;
method:function(){
//方法的代码
}
};

模块模式通过为单例添加私有变量和特权方法增强

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var singleton=function(){
var privateVariable=10;
function privatFunction(){
return false;
function privateFunction(){
return false;
}
return {
//特权方法和属性
publicProperty:true,
publicMethod : function(){
privateVariable++;
return privateFunction();
}
};
}();

可以使用构造函数模式、原型模式来实现自定义类型的特权方法,也可以使用模块模式、增强的模块模式来实现单例的特权方法

Javascript 高级程序设计

Javascript 高级程序设计(一)

<script>中内嵌部分代码中不能用</script>,因为解释器遇到script后就会解释为script脚本停止。
<script type=text/javascript src=“a.js”>这个时候会忽略后面的内嵌javascript转而变成引用外部的“a.js”

通常外部引用都要放到head中,例如CSS,但是为了加速页面的加载,javascript的外部引用一般放在<body>的最末尾

也可以用defer属性 延迟加载脚本
async属性 (HTML5)新增 但是不保证会按照async的属性来加载
写法如下:

1
<script type=“text/javascript” async src=“1.js”>

不要在异步脚本加载期间修改DOM

异步脚本一定会在页面load后执行,但可能在DOMContentLoaded之前或之后发生。

标识符指的是变量,函数和属性的名字,或者函数的参数。

严格模式 “use strict” 某些不确定行为将得到处理,不安全操作也会抛出异常。

Javascript中的变量为松散类型的,即可以保留任何类型的数据。
给未经声明的变量赋值会在严格模式下抛出ReferenceError错误
严格模式下不能定义名为eval或arguments的变量,否则会导致语法错误

三星面试面经

三星面试面经

一开始是自我介绍,然后介绍一下自己做的项目,画了一下系统框图,主要对项目的整体框架准备得不太充分,画得不太具体,被面试官问到了许多漏洞,应该事先好好准备一下,然后突出一下自己做的部分,虽然自己做的有点low。

然后就是笔试写代码部分,可能是一直在调试,好久没写代码的缘故,其实就是基础不太扎实,问了两个很简单的问题都答得不是太好,自我感觉是跪了,
第一题问的是状态机的实现方式,做的是一个序列检测器,应该先画一个状态转移图然后再去写代码,感觉自己逻辑关系都没有搞清,就去实现,所以代码写的不是很好,有些漏洞,而且也没有加入idle的状态,所以被面试官说的不够严谨,他们要招的是一个RTL级的verilog代码编写者,显然我这方面水平不行。然后还要一道是占空比为1:1的5分频,由于之前写的都是偶数分频的程序,并没有写过奇数倍分频的程序,所以这个思想也要掌握下,
以下贴出的是网上的代码:感觉也可以用于其他奇数倍的分频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module div_5(clkin,rst,clkout); 
input clkin,rst; 
output clkout; 
reg[2:0] step1,step2; 
always @(posedge clkin) 
if(!rst)  
step1<=3'b000
else 
begin 
case(step1)  
3'b000:step1<=3'b001;
3'b001:step1<=3'b011;
3'b011:step1<=3'b100
3'b100:step1<=3'b010
3'b010:step1<=3'b000
default:step1<=3'b000
endcase  
end 
always @(negedge clkin) 
if(!rst) 
step2<=3'b000
else 
begin 
case(step2) 
3'b000:step2<=3'b001
3'b001:step2<=3'b011
3'b011:step2<=3'b100
3'b100:step2<=3'b010
3'b010:step2<=3'b000
default:step2<=3'b000
endcase 
end 
assign clkout=step1[0]|step2[0]; 
endmodule

sanbufen

然后问了下C语言的题,感觉自己好久不看C语言,好多都不太会,有一题char与const char类型的比较,另一道题涉及指针以及函数的题,也觉得答得不是太好。
最后就问了下建立时间和保持时间,以及如何解决建立时间的问题,虽然之前看过一些时序分析的文档,但是也没有答得很好,只是讲了一下,感觉面试官应该不太满意,回来后查了一下应该就是将时钟速率降低,但是也不能降得太低。

人生中的第一次面试就在这样匆匆忙忙中结束啦,回来的地铁上还接到了导师的电话,晚上又谈了下项目,虽然这次面试结果不太好,但是还是有很多体会的。主要有以下几点:

  1. 对自己的项目介绍要充分有条理,包括框图的介绍,以及自己的工作完成情况。
  2. 对基础代码的书写要规范,感觉大公司很重视这一点,平时也要培养自己代码规范的习惯。
  3. 平时要积累一些数字电路方面的知识,以及时序约束方面的知识。

    最后说一点题外话吧,在实验室呆久了,容易不太了解外面的世界,也可能自身对自己要求不是很高,所以一直觉得自己还可以,有点漂,这次面试也是一个契机,是时候该沉下心来好好看一看书啦,以前总是在做项目,其实项目中的好多问题也是很基础的问题,所以回归基础应该是重中之重。