zoukankan      html  css  js  c++  java
  • JavaScript:this的用法

    1.全局执行上下文中的this

    function foo() {
        console.log(this)//指向window
            }
            foo()
    

    这段代码是在全局环境下执行的,所以this指向window

    2.通过函数的call方法设置

    let bar = {
                myname: "x",
                age: 18
            }
    
            function foo() {
                this.myname = 'y'
            }
            foo.call(bar)
            console.log(bar) //myname:"y"
            console.log(myname) //es6.html:22 Uncaught ReferenceError: myname is not defined
    

    call方法使得foo函数中的this不在指向window,而是指向了bar对象,所以最后会报错。除了call,你还可以使用bind和apply来改变this指向。

    3.通过对象调用方法中的this

     let bar = {
                myname: "x",
                age: 18,
                show: function() {
                    console.log(this) // bar{}
                }
            }
           bar.show()
    

    使用对象来调用其内部的一个方法,该方法的this指向对象本身。
    下面我们修改一下这段代码:

    let bar = {
                myname: "x",
                age: 18,
                show: function() {
                    console.log(this)
                }
            }
            var foo = bar.show
            foo() //window
    

    执行这段代码,你会发现this又指向全局的window对象了。
    小结:在全局环境中调用一个函数,函数内部this指向的是全局对象window;通过一个对象来调用其内部的一个方法,该方法中的this指向对象本身。

    4.构造函数中的this

    function CreateObj() {
                this.name = 'x'
            }
            var myobj = new CreateObj() // this指向myobj这个对象
    

    5.箭头函数

      btn.onclick = function() {
                console.log(this) //btn
            }
            btn.onclick = () => {
                console.log(this) //指向window
            }
    
    • 函数体内的this对象,就是定义时所在的对象,不是使用时所在的对象。固定改变不了
    • 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
    • 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

    注意

    1.嵌套函数中的this不会从外层函数中继承

    var obj = {
                show: function() {
                    function bar() {
                        console.log(this)
                    }
                    bar() // window
                }
            }
            obj.show()
    

    2.定时器内部的this

    注意看下面这两张图片中的代码:

    setTimeout实际为window.setTimeout,所以左图this指向window。而右图使用了箭头函数,this指向函数定义时所在的对象

    3.事件中的this

    addEventListener()事件处理程序会在其所属元素的作用域内运行,但当用了箭头函数则会导致里面的this指向改变。因此不建议在创建事件的时候搭配箭头函数使用

    还需注意:另一种添加事件的方法attachEventIE事件处理程序会在全局作用域中运行,因此this = window。

    p2.addEventListener('click', function () {
        console.log(this)     //p2元素
    })
    p2.addEventListener('click', event => {
        console.log(this)    //window
    })
    

    当然,实战才是硬道理,各位,可以开始码代码了!!!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    It's Android Time:程序员创富有道
    《linux核心应用命令速查》连载十五:chkconfig:设置系统的各种服务
    IBM资深副总裁 推荐《营销2.0最佳实践:网络营销时代的ANGELS制胜法则》
    《linux核心应用命令速查》连载十二:top:显示进程
    《linux核心应用命令速查》连载九:crontab:设置计时器
    软件测试管理是什么?
    Sandy Carter,IBM副总裁 推荐《营销2.0最佳实践:网络营销时代的ANGELS制胜法则》
    BizTalk Server 2010 使用 WCF Service [ 下篇 ]
    BizTalk请求JAVA的Web Service报错
    ExtJS 4.0 beta 3的更新说明
  • 原文地址:https://www.cnblogs.com/XF-eng/p/14241472.html
Copyright © 2011-2022 走看看