以下是2018年年终,面某公司的笔试题。为啥如今才分享出来,地道是因为之前懒。只分享题,没有答案。
1.请经由过程代码完成下面的效果
function add(num){
var total = 0;
var curryAdd = function(num){
total = total + num;
return total;
}
return curryAdd;
}
console.log(add(2)(3)); //效果为5
console.log(add(2)(3)(4)(5)); // 效果为14
2.请回复按钮点击前后,代码中的两个console.log在浏览器控制台的输出信息
并诠释征象背地的缘由.
let count = 0;
class MyComponent extends React.Component{
constructor(){
super();
this.state = {
count : count
};
}
componentWillMount(){
this.setState({
count : ++count
});
this.setState({
count : ++count
});
setTimeout(() => {
this.setState({
count : ++count
});
this.setState({
count : ++count
});
}, 1000);
}
componentDidMount(){
this.button.addEventListener('click', this.onClick.bind(this, '原生浏览器事宜'), false);
}
onClick(info) {
console.log(info);
this.setState({
count : ++count
});
this.setState({
count : ++count
});
}
render() {
console.log(this.state.count);
return (
<div>
<button type="button" ref={node => this.button = node} onClick={this.onClick.bind(this, 'React事宜')}>天生新计数</button>
<div>Count : {this.state.count}</div>
</div>
);
}
}
ReactDOM.render(<MyComponent />, mountNode);
3.throttle的简朴完成
function throttle(func, duration) {
// 在这里编写详细完成
}
window.addEventListener('scroll', throttle(func, 50), false);
4.完成一个深度优先搜索算法(非递归)
function dfs(tree, name){
// 请在这里完成
}
var tree = {
name : '中国',
children : [
{
name : '北京',
children : [
{
name : '旭日大众'
},
{
name : '海淀区'
},
{
name : '昌平区'
}
]
},
{
name : '浙江省',
children : [
{
name : '杭州市',
code : 0571,
},
{
name : '嘉兴市'
},
{
name : '绍兴市'
},
{
name : '宁波市'
}
]
}
]
};
var node = dfs(tree, '杭州市');
console.log(node); // { name: '杭州市', code: 0571 }
5.编写一个简朴的自定义事宜处理器: 1.具有 on 要领绑定事宜, 2.具有 off 要领解绑事宜
function EventEmitter () {
// TODO
}
var emitter = EventEmitter();
emitter.on('foo', function(e){
console.log('listening foo event 1', e);
});
emitter.on('foo', function(e){
console.log('listening foo event 2', e);
});
emitter.on('bar', function(e){
console.log('listening bar event', e);
});
// 监听悉数事宜
emitter.on('*', function(e){
console.log('listening all events');
});
emitter.trigger('foo', {name : 'John'});
emitter.trigger('bar', {name : 'Sun'});
emitter.trigger('*', {name : 'Sun'});
emitter.off('foo');
6.请用原生 JS 完成 DOM 拖动效果,只管多斟酌兼容以及其他能够的状况