-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
代码相关面试题合集 #40
Comments
2. 闭包相关,求 console.log() 输出
function fun(n, k) {
console.log(k)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); // k -> undefined a : {fun : function(){}}
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3); 分析首先是声明一个 fun 函数,该函数返回一个对象,对象里面有一个属性,也叫 fun,其值是一个函数,其函数返回的是外层 fun 函数执行的结果(有点绕,当时就是给绕晕了 >_<)
a = {
fun:function(m){
return fun(m,n);
}
}
a.fun(1); // 0
a.fun(2); // 0
a.fun(3); // 0 然后再来看下最后一个链接调用的表达式 首次执行 紧接着其链式执行 {
fun:function(m){
return fun(m,n);
}
} 这时跟上面执行 a.fun(0) 时是一样的,读取的 n 依然是之前 fun(0) 传入的 0,因此 k 打印为 0,但是这里返回给下一步链式调用的对象已经变了,是一个全新的对象,因此下一次链式调用时,返回的 var b = fun(0).fun(1).fun(2).fun(3);
// undefined
// 0
// 1
// 2 |
3. 闭包,求以下 console.log() 输出var result = []
var a = 10
function foo(a){
var i = 0;
for(; i < 3; i++){
result[i] = function() {
a += i * a
console.log(a)
}
}
}
foo(1)
result[0]()
result[1]()
result[2]() 这也算是一道经典的闭包相关的题目了。 |
4. 求以下输出var a = 10
function f(a) {
console.log(a)
var a = 2
function a() {}
console.log(a)
}
f(a) 主要考察变量提升,函数声明相关知识点 答案:
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。(我猜测应该是声明还没有真正改变其变量的指向) var length = 10
function foo() {
console.log(this.length)
}
var obj = {
length: 5,
fn: function(f) {
f()
arguments[0]()
}
}
obj.fn(foo, 1) 答案
调用 obj 对象下的一个函数属性 fn,fn 里面调用了传入的参数 f,也就是 foo,执行 f() 时,前面并没有调用的对象,因此 this 的指向仍然是全局,所以这里打印的是全局的 length 值 举例: var length = 10
function foo() {
console.log(this.length)
}
var arr = [foo, 4,5,6]
arr[0]() // 4 var f = true
if(f === true){
var a = 2
}
function foo(){
var b = 12
c = 16
}
foo()
console.log(a)
console.log(b)
console.log(c) 答案:
|
5. 如何用css画一个滚动球体?这是一个来回滚动的球体 <!-- html -->
<div class="ball">
@
</div> /** css **/
.ball{
width: 200px;
height: 200px;
border-radius: 50%;
color: #fff;
font-size: 32px;
display: flex;
justify-content: center;
align-items: center;
background-color: lightgrey;
animation: roll 3s linear infinite;
}
@keyframes roll {
0% {
transform: translate(0, 0) rotate(0deg)
}
50% {
transform: translate(500px, 0) rotate(360deg)
}
100% {
transform: translate(0, 0) rotate(0deg)
}
} |
6. 针对以下代码,写一段 JS,使其点击输出相应的序号,比如点击第三个 alert(3)<ul>
<li>haha</li>
<li>Yoyo</li>
<li>Wowowowo</li>
<li>Win~!</li>
</ul> 注意不能额外增加 dom 属性,比如 data-index 答案: var list = document.getElementsByTagName('li')
Array.from(list).forEach((item, i) => {
item.addEventListener('click', function(){
alert(i)
})
}) 通过 getElementsByTagName 获得是类数组对象,因此需要一层转换,然后再对其遍历,对每一个 li 进行监听 |
8. 求以下输出var foo = 10;
(function foo() {
foo = 123;
console.log(foo)
})() 答案 ƒ foo() {
foo = 123;
console.log(foo)
} 解释: var foo = 10;
(function foo() {
'use strict';
foo = 123;
console.log(foo)
})()
|
9. 问输出,为什么?var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x)
console.log(b.x) 答案:
解释: |
10. 词法作用域和动态作用域
|
11. 如何交换两个数值类型变量的值,不使用额外空间
[a, b] = [b, a]
示例: var a = 3, b = 5
a = a+b // 求和
b = a - b // 先重新赋值给 b
a = a - b // 再重新赋值给 a 还可以利用异或运算的特性
var a = 3, b = 5
a = a^b
b = a^b
a = a^b |
1. 创建一个如图类似的开关切换按钮,hover 时触发,并符合以下条件
这道题看上去,并不是很难,但是实际上考察样式方面的知识面特别广,实用性也很高,下面看看我的答案
.html
.css
codepen demo
The text was updated successfully, but these errors were encountered: