this-3

this是什么?
JavaScript中,this关键词指的是他所属的对象;
它拥有不同的值,具体取决于它的使用位置。

1、在单独情况下,this指向全局对象window;
2、在函数中,this指向全局对象window;
3、在严格模式的函数中,this为undefined;
4、在对象的方法中,this指的是所有者对象;
5、在事件中,this指的是接收事件的元素;
6、使用call/apply方法,可以将this引用到任何对象。

上述1/2可以说明普通函数中,内层函数不能从外层函数中继承this的值,在内层函数中,this会是window或是undefined。
临时变量self用来将外部this值导入到内部函数中(另外的方式是在内部函数执行bind(this))

<script>
    // var a = 43;
    function foo() {
        var a = 0;
        console.log(this.a);  // 2
        return function (a) {
            console.log(this.a);  // undefined或43 把var a = 43; 注释掉,会打印出undefined,不注释就是43(说明上述1/2点)
        };
    }

    var obj = { a: 2 };

    foo.call(obj)(); // 结果请看上述注释  foo的this被绑定到obj,注意是foo作用域内的this指向obj,返回函数的this为window
</script>

<script>
    console.log("--------------------------");
    function foo2() {
        var self = this;
        console.log(this.a);  // 3
        setTimeout(function () {
            var a = 4;
            /*
            下面这行代码里面的的a,表示的是对变量的调用,如果说匿名函数没有声明var a = 4;或匿名函数没有带形参,
            又或上层作用域foo2中没有形参及变量声明、最外层没有声明的话,则就是报错,
            而不是undefined:Uncaught ReferenceError: a is not defined
            有形参则是undefined。
            换句话说console.log(a)中就是去查找变量a啊,如果层层查找没有发现形参,也没有声明,那肯定是报错的啊。
            */
            console.log("形参:" + a);  // 形参:4
            console.log("对象属性:" + this.a); // 对象属性:undefined
        }, 100);

        var self = this;
        setTimeout(function () {
            console.log(self.a);  // 3  临时变量self将外部this值导入到内部函数。
        }, 100);
    }

    var obj2 = { a: 3 };

    foo2.call(obj2);

    // 2
    // undefined
    // -----------------------
    // 3
    // 形参:4
    // 对象属性:undefined
    // 3
</script>

 

posted @ 2021-07-05 10:54  し7709  阅读(47)  评论(0编辑  收藏  举报