(5)Javascript控制函数上下文

1.引言

      在本篇博客中我们主要讨论javascript中的this关键字,如果我们想要在javascript中实现模块化编程,不可避免的要和this打交道,控制好this的上下文是我们用好js模块化的第一步。

2.控制Javascript函数上下文

2.1函数调用控制上下文

      话不多少,首先我们先看一段代码

    var a=10;
        var moudle=new Object({
            a:5,
            showA:function(){
                alert(this.a);
            }
        });
        moudle.showA();//弹出5
        var b=moudle.showA;
        b();//弹出10
  • 第一:上面的例子我们可以看出this的上下文改变了,moudle.showA()中this的上下文为:moudle,而b()中的this上下文为window
  • 第二:方法的是由我们人为调用的(很重要)。
  • 那么我们的代码可以这样修改
        var a=10;
        var moudle=new Object({
            a:5,
            showA:function(){
                alert(this.a);
            }
        });
        moudle.showA();//弹出5
        var b=moudle.showA;
        b.call(moudle);//弹出5
        b.apply(moudle);//弹出5
  • 通过call函数和apply函数可以控制函数的上下文
  • 在此声明,此时函数是由我们人为调用的

2.2回调函数控制上下文(模仿lang.hitch方法)

      我们在看下面的代码

    <input id="btn" type="button" value="按钮">
    <script>
        var moudle=new Object({
            a:5,
            showA:function(e){
                alert(this.a+e.type);
            }
        });
        document.getElementById("btn").onclick=moudle.showA;
    </script>
  • 第一:点击按钮触发事件,发现a未定义(此处不要管this的上下文是什么,反正不是moudle
  • 第二:函数的触发是浏览器回调触发的。
  • 第三:我们在showA函数中需要用到两个重要的数据(一个是类中的a,一个是事件回调的数据e

此时我们应该如何控制我们的this关键字呢?我们定义一个控制上下文的函数

    //第一个参数是上下文,第二个参数是函数对象
     var hitch=function(context,fn){
            var callback=function(data)
            {
                fn.call(context,data);
            }
            return callback;
        }

我们如何使用呢?代码如下:

//当调用moudle.showA的函数的时候,将函数的上下文指定为moudle
document.getElementById("btn").onclick=hitch(moudle,moudle.showA)
  • 全部代码:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    <input id="btn" type="button" value="按钮">
    <script>
        var hitch=function(context,fn){
            var callback=function(data)
            {
                fn.call(context,data);
            }
            return callback;
        }
        var moudle=new Object({
            a:5,
            showA:function(e){
                alert(this.a+ ":"+e.type);
            }
        });
        document.getElementById("btn").onclick=hitch(moudle,moudle.showA);
    </script>
</body>
</html>

3.总结

在此篇博客中介绍了两种改变this上下文的方法:

  • 当自己调用函数时:直接通过call或者apply方法。
  • 当回调函数时,利用闭包控制this上下文。(对于我们模块化编程很重要),这样我们可以在模块中自由的控制this的指向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值