JS中的this

JS中的this和闭包


this

this 指的是 function 运行时的上下文!
在JS中方法是一级对象!

  • this的简单使用和指定运行上下文
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript">
        var obj = {
            func:function(){
                console.info("此方法的this ---> " + this);
            }
        }
        //调用obj的func()方法
        //此时方法的this就是所属对象
        obj.func();

        var func2 = obj.func;
        //承接得到obj中方法
        //若无所属对象,则为window 宿主对象
        func2();


        console.info('call方法指定函数运行的上下文');

        //指定函数运行的上下文
        window.color = 'red';
        var obj1 = {
            color:'blue'
        }
        function sayColor() {
            console.info('this--> ' + this + ' color -->' + this.color);
        }

        //Function 对象的call方法,参数为可选参数
        //call(x,y1,y2...),x为指定函数的运行上下文,y1,y2为函数的实参
        sayColor.call(window);
        sayColor.call(obj1);


        console.info('apply方法指定函数运行的上下文');

        //Function 对象apply方法,跟两个参数,第一个为函数运行的上下文,后一个为实参数组
        function say(message) {
            //设置缺省值
            console.info((this.name ||'无名氏' )+' 说 '+ (message||'nothing'));
        }
        window.name = '窗口';
        function Person(name) {
            this.name = name;
        }
        var person = new Person('kan');

        say.apply(window,['看不见的笑,我怎么睡得着']);
        say.apply(person,['还有没有结果']);



    </script>
</head>
<body>
    <h1 style="text-align:center">Js中this</h1>
</body>
</html>

这里写图片描述


闭包

默认情况下,函数的执行的上下文调用它的函数的上下文 的相同,也可通过Function的bind方法改变函数的执行上下文!

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>动态时间</title>
    <script>
        window.onload = function () {
            //1.动态更新时间,全局函数默认this为window
            //var lableTime = document.getElementById("time");
            //console.info(lableTime);
            //function showTime() {
            //    console.info('function 的执行上下文 ' + this);
            //    //此时函数的执行的上下文和 调用函数setInterval 的上下文 的一样,都是window对象
            //    console.info(this);
            //    lableTime.innerHTML = new Date().toLocaleString();
            //}
            //setInterval(showTime,1000);

            //2.当函数的运行上下文为一个对象时

            var obj = {
                lableTime: document.getElementById("time"),
                showTime: function showTime() {
                    console.info('function 的执行上下文 ' + this);

                    console.info(this);
                    if (!!this.lableTime) {
                        this.lableTime.innerHTML = new Date().toLocaleString();
                    }
                }
            }
            //默认情况下,函数的执行的上下文和 调用函数setInterval 的上下文 的一样,都是window对象
            // setInterval(obj.showTime, 1000);
            //但是这里需要改变函数的上下文,调用Function的bind方法
            setInterval(obj.showTime.bind(obj), 1000);

        }
    </script>
</head>
<body>
    <h2 id="time" align="center"></h2>
</body>
</html>
  • 错误解析
setInterval(obj.showTime, 1000);

因为showTime是对象obj的一个方法,所以它的默认this指向obj,而通过setInterval调用它,则它的this指向调用方法的this,即window,而window下面没有labelTime属性,所以程序出错,不能运行

这里写图片描述

  • 修正 ,通过bind方法改变函数的运行上下文
 setInterval(obj.showTime.bind(obj), 1000);

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值