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.