Go to comments

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.

Leave a Reply

换一张