1

1.上下文初步了解:

我们来研究一下函数的上下文(context),所谓的上下文就是指函数里面的this是谁。
clipboard.png

当一个函数当做对象的方法被调用的时候,这个函数里面this表示这个对象:

<script type="text/javascript">
        var obj = {
            xingming: "爱前端",
            age : 2,
            sayHello : function(){
                alert("你好,我叫做" + this.xingming+ "!我的年龄是" + this.age + "岁");
            }
        }

        obj.sayHello();  //你好我叫做爱前端!我的年龄是2岁
    </script>

现在我们调用sayHello函数的时候,是通过obj打点调用的,所以现在这个sayHello函数的上下文就是obj对象。 即sayHello函数内部的this指向obj。
但是,千万不要认为写在对象里面的函数,上下文一定是这个对象!!
比如:

<script type="text/javascript">
    var obj = {
        xingming : "爱前端",
        age : 2,
        sayHello : function(){
            alert("你好,我叫做" + this.xingming + "!我的年龄是" + this.age + "岁");
        }
    }
         
     var fn = obj.sayHello;  //拿出了这个函数
     fn();  //直接圆括号调用!!不是对象打点调用!你好,我叫做undefined!我的年龄是undefined岁。
</script>

浏览器运行结果:

clipboard.png

因为圆括号调用函数,上下文是window对象。
函数的上下文是什么,取决于函数怎么调用,而不是函数如何定义。
函数的上下文是函数的调用时表现的性质,不是函数定义的时候写死的性质。

2.函数上下文遵循五个规律

2.1函数用圆括号调用,函数的上下文是window对象

<script type="text/javascript">
    function fun(){
        var a = 1;
        alert(this.a);  //实际上访问的是window.a
    }

    var a = 2;
    fun();   //弹出2
</script>

函数function fun(){}的上下文是什么呢?不要看它怎么定义,要看它怎么调用。此时是fun()函数名加上圆括号直接调用,上下文就是window对象!
而我们知道:所有的全局变量都是window对象的属性,(注意:函数里面的局部变量,不是window的属性,不是任何东西的属性,它就是一个变量。)程序弹出666。
2.2函数如果作为一个对象的方法,对象打点调用,函数的上下文就是这个对象
比如下面的例子,我们把fun函数定义出来了,然后又把这个函数绑定给了obj对象的c属性:

<script type="text/javascript">
    function fun(){
        alert(this.a);  //相当于弹出obj.a
    }

    //对象
    var obj = {
        "a" : 1,
        "b" : 2,
        //给这个对象增加一个方法,值就是fun函数
        "c" : fun  
    }

    //我们要看清楚函数执行的时候,是怎么执行的。
    //现在不是圆括号直接执行,而是一个对象打点调用这个函数执行,所以函数的上下文是obj对象!
    obj.c();   //弹出1
</script>

调用的时候,是“对象.函数()”
此时根据规律,函数里面的this是这个对象。所以能够弹出1。
2.3函数是事件处理函数,函数的上下文就是触发这个事件的对象
下面我们定义了一个fun,然后把这个fun当做了3个DOM元素的事件处理函数:

<script type="text/javascript">
    //函数
    function fun(){
        this.style.background = "red";
    }
    var box1 = document.getElementById("box1");
    var box2 = document.getElementById("box2");
    var box3 = document.getElementById("box3");
        
    // 把同一个函数绑定给不同的对象
    // this就是点击谁就是谁
    box1.onclick = fun;
    box2.onclick = fun;
    box3.onclick = fun;
</script>

函数不会执行,直到用户点击了某一个div标签。此时点击谁,this就是谁!
2.4定时器调用函数,上下文是window对象

<script type="text/javascript">
    //函数
    function fun(){
        alert(this.a);
    }
         
    var a = 1;
    setInterval(fun,1000);
</script>

函数fun被定时器调用,此时函数的上下文就是window对象。每秒钟能弹出1.
2.5数组中存放的函数,被数组索引之后加圆括号调用,this就是这个数组
比如:

<script type="text/javascript">
    function fun(){
        alert(this === arr); //true
        alert(this.length);  //3,因为数组的长度是3
    }

    var arr = [fun,1,2];
    arr[0]();
</script>

一定要敏感:
arr[0]();
此时这个函数是从数组中枚举出来然后加圆括号执行的,所以最终调用者可以认为是这个数组,上下文就是这个数组!


Always明媚
21 声望0 粉丝

stay hungry