javascript 改变函数内this的指向 bind()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA_Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <button>按钮1</button>
    <button class="button">按钮2</button>
    <script>
        // bind() 绑定 捆绑的意思
        // bind()方法不会调用函数。但是能改变函数内部this指向
        // fun.bind(thisArg, arg1, arg2, ...)
        // thisArg:在fun函数运行时指定的this值
        // arg1 , arg2:传递的其他参数
        // 返回由指定的this值和初始化参数改造的原函数拷贝

        var o = {
            name:'andy'
        };
        function fn(a,b) {
            console.log(this);
            console.log(a + b);
        };
        var f = fn.bind(o,1,2);
        // 1. bind 并不会向 call() apply()一样,它执行后不会调用原来的函数
        // 2. 可以改变原来函数内部的this指向
        // 3. 返回的是原函数改变后this之后产生的新函数
        f();


        // 4. 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的 this 指向 , 此时用bind
        //我们有一个按钮,当点击了之后,就禁用这个按钮,3秒钟后开启这个按钮
        var btn = document.querySelector('button');
        btn.onclick = function () {
            this.disabled = true;// 这个 this 指向的是 btn 这个按钮
            var that = this;
            setTimeout(function () {
                that.disabled = false; // 定时器函数里面的 this 指向的是 window 所以需要用 that 把 btn传进来
            },3000)
        };
        //还可以这样写 如下:
        var btn1 = document.querySelector('.button');
        btn1.onclick = function () {
            this.disabled = true;// 这个 this 指向的是 btn 这个按钮
            setTimeout(function () {
                this.disabled = false;
            }.bind(this),3000);//这个 this 指向的是 btn1 
        }
    </script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA_Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <script>
        var btns = document.querySelectorAll('button');
        for (var i = 0;i < btns.length;i++){
            btns[i].onclick = function () {
                this.disabled = true;
                setTimeout(function () {
                    this.disabled = false;
                }.bind(this),2000);
            }
        }
    </script>
</head>
<body>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_45949073/article/details/107452316