zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Linux下卸载Oracle 11g
    Oracle
    Oracle 数据库启动与关闭
    1-centos7安装oracle 11gR2
    0-windows7硬盘安装centos7
    查重 查重复记录 删除重复记录
    用户情景快速指南
    智能led灯具HMI(无线终端参数设置界面)
    LBDP-Z APP在线升级指南
    智能led灯具HMI(用户模块及管理员模块)操作说明
  • 原文地址:https://www.cnblogs.com/della/p/3356879.html
Copyright © 2011-2022 走看看