JavaScript 面试题05
001. EXAMINATION QUESTIONS
阅读以一下代码,写出以下程序的执行结果
var foo = '123';
function print(){
var foo = '456';
this.foo = '798';
console.log(foo);
}
print(); // 456
// 首先"print()"执行时候,函数里面的this是window,然而它打印的是自己AO里的foo打印456
// 全局里打印foo console.log(foo); // 789把这个题变个形式,打印结果是什么?
var foo = '123';
function print(){
this.foo = '234';
console.log(foo);
}
new print(); // 234
// 1). 首先print函数里没有声明foo,打印的肯定是GO里面的foo,也就是window里面的,或者说是全局里面的foo,
// 2). 全局里面的foo原来是123
// 3). 现在this.foo的this指代的是window,而全局的变量都归window所有,相当于把foo给改234了
// 4). 最后打印结果234再改一下"new print()",打印的是什么?
var foo = '123';
function print(){
this.foo = '234';
console.log(foo);
}
new print(); // 123
// new操作后,this现在有人了,this.foo = 234是这个人身上的了,然而并没有什么用,现在访问的是foo,又不是this上的foo。
// foo在AO里没有,没有到上面找foo = 123
// 这次函数里的this有人了,就不指向window了,所以就不能改变123了002. EXAMINATION QUESTIONS
在看一个类似上面的题,运行test()和new test()的结果分别是什么?
var a = 5;
function test(){
a = 0;
alert(a);
alert(this.a);
var a;
alert(a);
}
test(); // 0、5、0
/***
AO {
a : undefined,
this : window // 预编译时this指向window
}
AO {
a : 0, // 第一行a等于0
this : window // 预编译时this指向window
}
var a = 5;
function test(){
a = 0;
alert(a); // 0 AO里面有a = 0
alert(this.a); // 5 预编译时候this指向window
var a;
alert(a); // 0 AO里还是0
}
test(); // 0 5 0
***/"new test()"的结果
var a = 5;
function test(){
a = 0;
alert(a);
alert(this.a);
var a;
alert(a);
}
new test(); // 0、undefined、0
/***
new一个函数执行也有AO
AO {
a : 0, // a还是0
this : {} // this执行时发生点变化,变成对象了
}
var a = 5;
function test(){
var this = { // 隐式的生成
__proto__ : test.prototype
}
a = 0;
alert(a); // 还是 0
alert(this.a); // this上没有a,一个对象上没有的属性,打印是undefined
var a;
alert(a); // 最后a还是 0
}
new test(); // 0、undefined、0
问题天使: "var a"是把a提升到AO里面,this也提升到AO里面,现在打印的是"this.a",找到this上面没有a
***/003. EXAMINATION QUESTIONS
阅读以下代码,写出一下程序的执行结果。(这个题考的是预编译)
function print(){
console.log(foo);
var foo = 2;
console.log(foo);
console.log(hello);
}
print();
/***
AO {
foo : undefined
}
AO{
foo : 2
}
function print(){
console.log(foo); // nudefined
var foo = 2;
console.log(foo); // 2
console.log(hello); // 到这,这个题有问题,打印hello这就报错了,没有变量hello就报错了"hello is not defined"
}
print();
***/PS: 一定要精明一点,一旦发现题这么出,要显示自己的本事,写报错还不行,还要把错误信息写上"hello is not defined",展示一下自己的本事。
004. EXAMINATION QUESTIONS
请阅读以下代码,写出以下程序的执行结果。(这个题考的还是预编译)
function print(){
var test;
test();
function test(){
console.log(1);
}
}
print(); // 1
/***
01.
AO{
test : undefined
}
02.
因为有函数"function test(){ console.log(1);}",肯定覆盖AO里面的变量test
03.
AO{
test : function test(){ console.log(1);}
}
04.
test()正常执行,打印结果是 1
***/005. EXAMINATION QUESTIONS
请阅读以下代码,写出以下程序的执行结果。(考的是,有没有隐士类型转换,这个太简单了)
function print(){
var x = 1;
if(x == "1")console.log("One!");
if(x === "1")console.log("Two!");
}
print(); // One!
/***
function print(){
var x = 1;
if(x == "1")console.log("One!"); // 数字1等于字符串"1",有隐式类型转换,打印"one"
if(x === "1")console.log("Two!"); // 不全等
}
***/006. EXAMINATION QUESTIONS
请阅读以下代码,写出以下程序的执行结果
function print(){
var marty = {
name : "marty",
printName : function(){
console.log(this.name);
}
}
var test1 = { name : "test1"};
var test2 = { name : "test2"};
var test3 = { name : "test3"};
test3.printName = marty.printName;
var printName2 = marty.printName.bind({name : 123});
marty.printName.call(test1);
marty.printName.apply(test2);
marty.printName();
printName2();
test3.printName();
}
print();
/***
function print(){
var marty = {
name : "marty",
printName : function(){
console.log(this.name);
}
}
var test1 = { name : "test1"};
var test2 = { name : "test2"};
var test3 = { name : "test3"};
test3.printName = marty.printName;
// var printName2 = marty.printName.bind({name : 123}); // bind()是es3以上的
marty.printName.call(test1); // test1
marty.printName.apply(test2); // test2
marty.printName(); // marty
//printName2(); // bind()语法是es3以上的
test3.printName(); // text3有printName方法,因为上面"test3.printName = marty.printName",test3调用所以打印结果是text3
}
print();
这题很简单
***/007. EXAMINATION QUESTIONS
请阅读以下代码,写出程序的执行结果 (这个题有意思):
var bar = {a:"002"};
function print(){
bar.a = 'a';
Object.prototype.b = 'b';
return function inner(){
console.log(bar.a);
console.log(bar.b);
}
}
print()(); // 这个形式比较新颖,看看括号再括号
/***
看看括号再括号做了些什么?
01
第一个括号了什么?
1). 首先把这个函数返回,
function inner(){
console.log(bar.a);
console.log(bar.b);
}
2). 让bar的a=002变成字符串的a="a",对象bar是全局上的。
接下来让Object.prototype.b = 'b'。
然后把这个函数给返回了
var bar = {a : "a"}; // 这里变成{a : "a"}
function print(){
bar.a = 'a';
Object.prototype.b = 'b';
return function inner(){
console.log(bar.a); // bar.a的值已经变成 "a"
console.log(bar.b); // 到原型链上去找返回"b"
}
}
print();第一个括号
02
第二个括号:
把函数返回之后,在外面在执行。
bar.a已经变成"a"了
bar.b到原型链上找返回"b"
03
"print()()"这种形式之前没看过,括号再括号,第一个括号返回的是一个函数,第二个括号是"返回函数"的执行。
***/
Leave a comment
0 Comments.
