AdMaster筆試題
- 變量作用域
var a = 'hello';
(function(){
a = 'world';
})();
console.log(a); // "world"
var a = 'hello';
(function(){
var a = 'world';
})();
console.log(a); // "hello"
- 閉包
var foo = function(){
var count = 0;
return function(){
return count+=1;
}
};
var fn = foo();
console.log(fn()); // 1
console.log(fn()); // 2
console.log(fn(3)); // 3
console.log(fn(6)); // 4
- this指向
var person = {
age:18,
say:function(){
return this.age;
}
};
var say = person.say;
console.log(person.say()); // 18
console.log(person.say(20)); // 18
console.log(person.say({age:20})); // 18
console.log(say()); // undefined
console.log(say.call(person)); // 18
person.age += 1;
console.log(say.call(person)); // 19
console.log(say.apply(person,[32])); // 19
這里基本功不扎實(shí)可能被參數(shù)迷惑庄呈,console.log(person.say({age:20}));我以為會(huì)自動(dòng)調(diào)用setter方法枉证,覺(jué)得有坑账阻,寫(xiě)了20,實(shí)際上還是18豁护。
云鳥(niǎo)科技
- js執(zhí)行順序以及變量提升
function fn(a) {
console.log(a);
a = 1;
console.log(a);
var a = function() { //函數(shù)1
console.log(1);
}
console.log(a);
function a() { //函數(shù)2
console.log(2);
}
console.log(a);
}
fn(2);
輸出結(jié)果:
[Function: a] //函數(shù)2
1
[Function: a] //函數(shù)1
[Function: a] //函數(shù)1
這里考察js的對(duì)象創(chuàng)建和執(zhí)行順序衰齐,執(zhí)行上下文(EC)創(chuàng)建的過(guò)程是有先后順序的:參數(shù)聲明 > 函數(shù)聲明 > 變量聲明锉屈,函數(shù)的聲明比變量?jī)?yōu)先級(jí)要高苍狰,并且定義過(guò)程不會(huì)被變量覆蓋办龄,除非是賦值,但函數(shù)聲明會(huì)覆蓋參數(shù)
這里有一篇文章解釋的很明白:深入理解JavaScript執(zhí)行上下文淋昭、函數(shù)堆棧俐填、提升的概念
- BFC理解及應(yīng)用
主要理解什么是BFC(塊級(jí)格式化上下文),對(duì)于處理margin的重疊翔忽,清除浮動(dòng)英融,以及雙列伸縮布局的應(yīng)用,可以自行百度了解歇式。
必要商城
- iframe的優(yōu)缺點(diǎn)(seo?同域不同域修改dom驶悟?)
- 描述一下HTML的語(yǔ)義化
- jsonp的原理以及不足之處
- 以下可以用來(lái)在瀏覽器和服務(wù)器之間傳輸?shù)氖牵?/li>
- cookies
- localStorage
- sessionStorage
- session
- DOCTYPE作用,包含哪幾種類(lèi)型材失?
- 閉包是什么痕鳍,有什么特性,對(duì)頁(yè)面有什么影響龙巨?
- 寫(xiě)出下列代碼輸出結(jié)果
function A(name){
if(name)this.name = name;
};
function B(name){
this.name = name;
};
function C(name){
this.name = name||'test';
};
A.prototype.name = 'Tom';
B.prototype.name = 'Bob';
C.prototype.name = 'Alice';
console.log(new A().name+new B().name+ new C().name);
// Tomundefinedtest
易到用車(chē)
var num = 10;
var obj = {
num :8,
inner:{
num:6,
fn:function(){
console.log(this.num);
}
}
};
num = 888;
obj.inner.fn(); //6
var foo = obj.inner.fn;
foo(); //888
(obj.inner.fn)(); //6
(obj.inner.fn = obj.inner.fn)(); //888
self
- 事件循環(huán)執(zhí)行順序
console.log('start');
var promise = new Promise((reslove,reject) => {
console.log('promise-define');
reslove('promise-reslove');
});
function excuFn(callback) {
callback();
}
var log = () => console.log('callback');
setTimeout(() => {
console.log('timeout');
}, 0);
promise.then((data) => console.log(data),(err) => {console.log(err);
});
excuFn(log);
console.log('end');
結(jié)果:
start
promise-define
callback
end
promise-reslove
timeout
此處看callback是同步執(zhí)行的(不考慮xhr和延時(shí)處理)额获。
- 原型鏈與構(gòu)造函數(shù)
function Foo(){
getName=function(){
console.log(1)
};
return this;
}
Foo.getName = function(){
console.log(2);
};
Foo.prototype.getName = function(){
console.log(3);
};
var getName = function () {
console.log(4);
}
function getName(){
console.log(5)
};
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName(); //3
- 函數(shù)的定義和聲明
var scareMe = function () {
console.log("Boo!");
scareMe = function () {
console.log("Double boo!");
};
};
// 1. adding a new property
scareMe.property = "properly";
// 2. assigning to a different name
var prank = scareMe;
// 3. using as a method
var spooky = {
boo: scareMe
};
// calling with a new name
prank(); // "Boo!"
prank(); // "Boo!"
console.log(prank.property); // "properly"
// calling as a method
spooky.boo(); // "Boo!"
spooky.boo(); // "Boo!"
console.log(spooky.boo.property);// "properly"
// using the self-defined function
scareMe(); // Double boo!
scareMe(); // Double boo!
console.log(scareMe.property); // undefined
解釋參考自定義函數(shù)
- 箭頭函數(shù)的this
window.name = "window";
function fn(){
setTimeout(() => {
console.log("name:",this.name)},100)};
fn.call({name:"foo"})
結(jié)果:name:foo