Webcourse/12-前端进阶/01-前端的几道面试题.md

276 lines
3.7 KiB
Markdown
Raw Normal View History

2018-03-13 23:12:27 +08:00
几道面试题
## 页面布局
**问题**:如何实现一个三栏布局,要求两边固定宽度、中间自适应。
此题可以考察的知识点:
- 圣杯布局
- 双飞翼布局
- flex布局css3
## 变量提升
**问题**说一下你对JavaScript变量提升的理解。
### 定义
在函数体内部,声明变量,会把该变量提升到函数体的最顶端。注意:**只提升变量声明,不赋值**。
**代码1**
```javascript
fn();
function fn() {
var x = 1;
var y = 2;
}
```
上方代码中:
1给fn创建函数上下文找到fn中**所有**用var声明的变量即x和y
2将这些变量初始化为undefined
3将x赋值为1将y赋值为2。
**代码2**
```javascript
fn2();
function fn2() {
console.log(2);
}
```
上方代码中:
1创建全局上下文找到所有用function声明的变量在环境中“创建”这些变量。
2将这些变量**初始化**,并**赋值**为 `function(){ console.log(2) }`并不是undefined
3开始执行代码`fn2();`
**代码3**let的出现
```javascript
{
let x = 1
x = 2
}
```
上方代码中:
1找到所有用 let 声明的变量,在环境中「创建」这些变量
2开始执行代码注意现在还没有初始化
3执行 x = 1将 x 「初始化」为 1这并不是一次赋值如果代码是 let x就将 x 初始化为 undefined
4执行 x = 2对 x 进行「赋值」
代码4
```javascript
let x = 'global'
{
console.log(x) // Uncaught ReferenceError: x is not defined
let x = 1
}
```
原因有两个:
- console.log(x) 中的 x 指的是下面的 x而不是全局的 x
- 执行 log 时 x 还没「初始化」,所以不能使用(也就是所谓的暂时死区)
看到这里,你应该明白了 let 到底有没有提升:
- let 的「创建」过程被提升了,但是初始化没有提升。
- var 的「创建」和「初始化」都被提升了。
- function 的「创建」「初始化」和「赋值」都被提升了。
参考链接:
- [我用了两个月的时间才理解 let](https://zhuanlan.zhihu.com/p/28140450)
## this
问题:下方代码的打印结果是什么?
```javascript
function A() {
this.name = 'smyhvae';
}
A.prototype.test = function () {
setTimeout(function () {
console.log(this.name);
}, 1)
}
var a = new A();
a.test();
```
打印结果是window.name但实际的结果是空的。
这个神奇的特性被用来解决跨域数据传递。网上可以查一下iframe相关
**总结1**this永远指向函数运行时所在的对象而不是函数被创建时所在的对象。即**谁调用**,指向谁。
**举例**
```javascript
var name = '全局';
function getName() {
var name = '局部';
return this.name;
};
alert(getName());
```
上方代码的打印结果是:`全局`。
分析:`getName()`这个函数其实是window调用的所以this指向的window因为外部有name这个变量所以打印结果为`全局`。
**总结2**没有明确的当前对象时this永远指向window。这个在setTimeout里比较常见。
## 链式调用
**问题**如何实现类似jQuery的链式调用
答案一直return `this`就好了。
## Yslow和pageSpeed
Yslow和pageSpeed你知道怎么用吗你记得其中多少规则
```javascript
```
```javascript
```
```javascript
```
```javascript
```
```javascript
```
```javascript
```