zoukankan      html  css  js  c++  java
  • js中this那些事儿

    前几天写东西由于恶趣味作祟将所有的函数全部封装在json中,起初好好的,函数B也可以调用函数A的内容,不过在写一个点击事件时出现了意外,

    代码如下:

    var $ ={
        "A":function(x){
            alert("Hello World")
        },
        "B": function(){
            this.A();
        }
    }
    $.B();  //输出“Hello World”

    这样在json中别的函数内也能调用,当然仅仅这样我也没写这篇随笔了,下面Dome升级,上代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
    window.onload=function(){
        var btn=document.getElementById("btn");
        var $ ={
            "A":function(x){
                alert("Hello World")
            },
            "B": function(){
                btn.onclick=function(){
                    this.A();
                }
            }
        }
        $.B();
    }
    </script>
    </head>
    <body>
        <button id="btn">你好</button>
    </body>
    </html>

    点击按钮控制台包错:  this.A is not a function

    明明A函数定义了为什么显示A不是函数呢?

    我们看看上下两个案例B函数中的this的区别:

    //上面的案例
    "
    B": function(){ this.A(); console.log(this) } //输出: Object {A: function, B: function} A: function (x) B: function () __proto__: Object
    //下面的案例
    "B": function(){
            btn.onclick=function(){
                console.log(this)
                this.A();
        }
    }            
    
    //输出
    <button id="btn">你好</button>

    这就说明此时this指向的是btn,原因是this指的是,调用函数的那个对象

    那如果我们非在B函数中点击btn调用函数A呢,有没有办法?答案是有的,我们借用桥梁的思想,设置一个中间变量,上代码:

    var btn=document.getElementById("btn");
        var $ ={
            "A":function(x){
                alert("Hello World")
            },
            "B": function(){
                var that=this
                btn.onclick=function(){
                    console.log(that)
                    that.A();    //弹出“Hello World”
                }
            }
        }
        $.B();
    
    //控制台输出
    object {A: function, B: function}
        A: function (x)
        B: function ()
        __proto__: Object

    到这儿this的这个坑就算跳出来了,以后遇到别的坑也会在另行讲述

  • 相关阅读:
    访问者模式
    解释器模式
    享元模式
    职责链模式
    中介者模式
    单例模式
    桥接模式
    命令模式
    迭代器模式
    Python 学习笔记15 类
  • 原文地址:https://www.cnblogs.com/teersky/p/7428049.html
Copyright © 2011-2022 走看看