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 指向全局对象。这个问题是很多异步回调函
    数中普遍会碰到的;
  • 相关阅读:
    腾讯云环境配置之PHP5.6.3 + redis扩展 稳定版
    越狱后的ios如何用apt-get 安装各种命令
    批量 kill mysql 中运行时间长的sql
    谷歌Chrome浏览器开发者工具的基础功能
    话说好像是这样,ios下面通常用iframe来打开你的scheme地址; Android下通常用location.href来。。。 不过实际情况好像比这个复杂得多。。
    js判断移动端是否安装某款app的多种方法
    设计不错的网站
    BADIP filter
    开窗函数 函数() OVER()
    2018年1月初的一次面试题
  • 原文地址:https://www.cnblogs.com/xhds/p/5852722.html
Copyright © 2011-2022 走看看