zoukankan      html  css  js  c++  java
  • JavaScript中的this

    console.log(this);
    //window
    function xioahua(){
        console.log(this);
    }
    xiaohua();
    //普通函数调用
    //window
    'use strict'
    function xiaohua(){
        console.log(this);
    }
    xiaohua();
    //严格模式下函数调用
    //undefined
    
    (function xiaohua(){
        'use strict'
        console.log(this);  
    })()
    //让他在严格模式下立即调用
    //undefind
    var obj={ 
        name:'xiaohua',
        foo:function(){
            console.log(this.name)
        }
    }
    obj.foo();
    //作为对象的方法调用
    //xiaohua
    function test(){
        console.log(this.name);
    }
    var obj={ 
        name:'xiaohua',
        foo:test
    }
    obj.foo();
    //作为对象的方法调用
    //xiaohua
    //解释:同样不变,因为在 js 中一切都是对象,函数也是一个对象,对于 test ,它只是一个函数名
    ,函数的引用,它指向这个函数,当 foo = test,foo 同样也指向了这个函数。如果把对象的方法赋
    值给一个变量,然后直接调用这个变量呢:
    var obj={ 
        name:'xiaohua',
        foo:function(){
            console.log(this);
        }    
    }
    var xiaohuadawang=obj.foo;
    xiaohuadawang();
    //作为对象的方法调用
    //Window
    //解释:可以看到,这时候 this 执行了全局,当我们把 test = obj.foo ,test 直接指向了一个函数的引用
    ,这时候,其实和 obj 这个对象没有关系了,所以,它是被当作一个普通函数来直接调用,因此,this 指向全局对象。
    var obj={ 
        name:'xiaohua',
        foo:function(){
            console.log(this);
        },
        foo2:function(){
            console.log(this);
            setTimeout(this.foo,100);
        }
    }
    obj.foo2();
    //obj...
    //window
    //解释:执行这段代码我们会发现两次打印出来的 this 是不一样的:
    第一次是 foo2 中直接打印 this,这里指向 obj 这个对象,我们毋庸置疑;
    但是在 setTimeout 中执行的 this.foo ,却指向了全局对象,这里不是把它
    当作函数的方法使用吗?这一点经常让很多初学者疑惑;其实,setTimeout 也只
    是一个函数而已,函数必然有可能需要参数,我们把 this.foo 当作一个参数传给
    setTimeout 这个函数,就像它需要一个 fun 参数,在传入参数的时候,其实做
    了个这样的操作 fun = this.foo,看到没有,这里我们直接把 fun 指向 this
    .foo 的引用;执行的时候其实是执行了 fun() 所以已经和 obj 无关了,它是被
    当作普通函数直接调用的,因此 this 指向全局对象。这个问题是很多异步回调函
    数中普遍会碰到的;
  • 相关阅读:
    BZOJ1057:[ZJOI2007]棋盘制作——题解
    洛谷4147:玉蟾宫——题解
    洛谷1578:[WC2002]奶牛浴场——题解
    BZOJ1926:[SDOI2010]粟粟的书架——题解
    BZOJ3123:[SDOI2013]森林——题解
    BZOJ1834:[ZJOI2010]网络扩容——题解
    BZOJ2668:[CQOI2012]交换棋子——题解
    BZOJ1070:[SCOI2007]修车——题解
    BZOJ1877:[SDOI2009]晨跑——题解
    在阿里,我们如何管理测试环境
  • 原文地址:https://www.cnblogs.com/xhds/p/5852722.html
Copyright © 2011-2022 走看看