js一些题目-this指向和变量提升

  

 

console.log在不同的地方也会导致不同

 

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {}  
}  
b();  
console.log(a); 

 

 

2018年4月18日更新:

第一题:

var a=3
var b=function(){
  alert(a)
  var a = 4
  alert(a)
}
b()

第二题:

var a=3
var b={
  a:4,
  getA:function(){
    this.a=5
    return function(){return this.a}
 }
}
b.getA()()

第三题:

第二题中如何得5?

(答案在最下面)

 再看一个类似的:看不太懂二者之间的区别 a和foo.bar.baz()

var x = 0;
var foo = {
    x:1,
    bar:{
        x:2,
        baz: function () {
           console.log(this.x)
        }
    }
}

var a = foo.bar.baz
foo.bar.baz() // 2
a() //0

 


 

假期在家,看到的,昨天看了下;

原文链接:http://wwwcqamin.duapp.com/?p=102#comment-7

请说出下面程序的输出结果

第一题:

1
2
3
4
5
6
7
8
9
10
function funny(a) {
    console.log(a);
    var a = 10;
    arguments[0] = 20;
    return a;
    function a() {
        return 1;
    }
}
console.log(funny(8));

step1:

function funny(a) {
    console.log("1: " + a);
    var a = 10;
}
console.log(funny(8));

跟我想的恰恰相反……

step2:

func的arg,在func里面又被定义为变量,返回;在被定义为func会有哪些影响呢?

根据例子来看,return后function还是有效的

step3:

假如这样的话,又会如何呢?

function funny(a) {
    console.log("1 : " + a);
    var a = 10;
    arguments[0] = 20;
    return a;
    function a() {
         a = 100;
    }
}
console.log(funny(8));

 

第二题:

1
2
3
4
5
6
7
8
function joke(s) {
    return s;
    s = 2;
    var s = function() {
        return s;
    }
}
console.log(joke("are you kinding?"));

第三题:

1
2
3
4
5
6
7
8
function joke(s) {
    return s;
    s = 2;
    function s() {
        return s;
    }
}
console.log(joke("are you kinding?"));

二三的差别就是一个是函数,一个是函数式的变量,但是为什么会产生这两种结果呢?

第四题:

1
2
3
4
5
6
7
8
9
10
11
12
function s() {
    return 1;
}
var a = (function(s){
    var s;
    return s;
    function s() {
        return 3;
    }
    s = 2;
})();
console.log(a);

第五题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function s() {
    return 1;
}
var a = (function(s){
    return s;
    function s() {
        return 3;
    }
    s = function() {
        return 4;
    };
    s = 5;
})(function() {return 0;});
console.log(a);

step1:函数式和函数放在一起,先执行哪个呢?

function s() {
    return 1;
}
var a = (function(s){
    return s;
    function s() {
        return 3;
    }
    s = function() {
        return 4;
    };
    
    s = 5;
})();
console.log(a);

 

step2:return在上面的时候,无论两个如何放置都先执行s()

return 在下面的时候,无论两个如何放置都先执行var s = func()

这是为什么呢?

var a = (function(){
    return s;
    s = function() {
        return 4333;
    };
    function s() {
        return 3;
    }
})();
console.log(a);
var a = (function(){
    
    s = function() {
        return 4333;
    };
    function s() {
        return 3;
    }
    return s;

})();
console.log(a);

 

第六题:

1
2
3
4
5
var i = 0;
for(var j=0;j<10;j++) {
    i = i++;
}
console.log(i);

第七题:

1
2
3
4
5
6
7
8
9
var a = {"x": 1};
var b = a;
a.x = 2;
console.log(b.x);
 
a = {"x":3};
console.log(b.x);
a.x = 4;
console.log(b.x);

第八题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function haha() {
    return true;
}
 
function hehe() {
    if(!haha() && [] == ![]) {
        return "^_^";
    }
    function haha() {
        return false;
    }
    return "T_T";
}
console.log(hehe());

第九题:

1
2
3
var a = function(t) { return t; }
(1 + 2).toString();
console.log(a);

第十题:

1
2
3
4
5
6
7
8
9
function f(a){
    console.log(a);
    console.log(arguments[0]);
    var a = 10;
    console.log(a);
    return a;
    function a(){};
}
f(1);

第十一题:

1
2
3
4
5
6
console.log(Function instanceof Object);
var arr = [];
console.log(arr.constructor === Array.prototype.constructor);
var num1 = new Object(1);
var num2 = new Number(2);
console.log(num1.constructor === num2.constructor);

第十二题: (菜锅友情赞助)

1
2
3
4
5
6
var a = function b() {
    console.log(b);
    console.log(a);
    return b;
}();
console.log(b);

 

 

1.func a ; 20
function(){}虽然在return之后,但是这样函数声明被提前了

2.are you kinding?
return 后面不执行

3.function s()…
同1

4.function s()…
同1

5.function s() {
return 3;
}
猜错了,以为是return 0 原来 return 3 还在参数后面执行

6. 0
考眼力啊

7.2,2,2
object是指向而非复制

8.^_^
[] == ![],[]建立新的数组,所以是true。假如是{} != {} 就是报错了,实在不知道为什么

9.著名的括号问题啊,头一次听说,真汗颜 ,见知乎

10.func func 10

11.ture ture ture
一切皆是obj;

12.func(){…};undefined;报错
最后一个是因为 b 在 a 里面,全局里面没有

博主回复:

这些题主要是声明提前的陷阱题,还有几个是比较经典的陷阱题,只是被我稍微修改了下。[] == ![],其实是这样的:![]会转换为false,在等号关系式中,由于两边类型不相同且有一边是Boolean型变量,则转换成数字比较,false-》0 ,[]-》0, 故 [] == ![]

 

b.getA().call(b)

 

 

 

 

 

posted @ 2013-10-08 12:37  星堡a  阅读(368)  评论(0编辑  收藏  举报