前端基础类学习

为何常常栽在call,apply,bind这些函数

2017-10-31  本文已影响37人  饥人谷_米弥轮

1. call、apply、bind作用于函数上

2. call

<script type="text/javascript">
    var Dog = function () {
        this.name = "旺星人";
        this.shout = function () {
            alert(this.name);
        }
    };

    var Cat = function () {
        this.name = "喵星人";
    };

    var dog = new Dog();
    var cat = new Cat();
    dog.shout.call(cat); //dog.shout中的this对象,将指向cat对象。
    dog.shout();    //this还是指向dog 
</script>

3. apply

<script type="text/javascript">
    var xh = {
        name: "小红",
        job: "JS工程师"
    };

    var xm = {
        name: "小明",
        job: "资深前端开发工程师"
    };

    var jx = {
        name: "杰西",
        job: "前端开发总监"
    };

    //杰西,男,今年24岁,在前端开发网担任前端开发总监一职
    function myjob(gender, age, company) {
        alert(this.name + "," + gender + ",今年" + age + "岁,在" + company + "担任" + this.job + "一职");
    }

    myjob.call(xh, "女", 22, "腾讯");
    myjob.call(xm, "男", 23, "谷歌");
    myjob.call(jx, "男", 24, "前端开发网");

    myjob.apply(xh, ["女", 22, "腾讯"]);
    myjob.apply(xm, ["男", 23, "谷歌"]);
    myjob.apply(jx, ["男", 24, "前端开发网"]);
</script>
总结:

3.bind

// 1.常用this赋值写法
<script type="text/javascript">
    var foo = {
        bar: 1,
        eventBind: function () {
            var _this = this;
            $('.someClass').on('click', function (event) {
                /* Act on the event */
                console.log(_this.bar); //1
            });
        }
    }
</script>

// 2.bind()改变this指向
<script type="text/javascript">
    var foo = {
        bar: 1,
        eventBind: function () {
            $('.someClass').on('click', function (event) {
                /* Act on the event */
                console.log(this.bar); //1
            }.bind(this));
        }
    }
</script>
<script type="text/javascript">

    var jx = {
        name: "杰西",
        gender: "男",
        age: 24,
        company: "前端开发网(W3Cfuns.com)",
        job: "前端开发总监",
        say: function () {
            alert(this.name + "," + this.gender + ",今年" + this.age + "岁,在" + this.company + "担任" + this.job + "一职");
        }
    };

    jx.say();

    var xm = jx.say.bind({
        name: "小明",
        gender: "男",
        age: 23,
        company: "谷歌 Google",
        job: "资深前端开发工程师"
    });
    xm();

    //注意:JavaScript1.8.5版本中,原生实现bind方法,目前IE9+,FF4,Chrome7+,opera
</script>
<script type="text/javascript">
    var bar = function () {
        console.log(this.x);
    }
    var foo = {
        x: 3
    }
    var sed = {
        x: 4
    }
    var func = bar.bind(foo).bind(sed);
    func(); //?

    var fiv = {
        x: 5
    }
    var func = bar.bind(foo).bind(sed).bind(fiv);
    func(); //?
</script>
<script type="text/javascript">
    var obj = {
        x: 81,
    };

    var foo = {
        getX: function () {
            return this.x;
        }
    }

    console.log(foo.getX.bind(obj)()); //81
    console.log(foo.getX.call(obj)); //81
    console.log(foo.getX.apply(obj)); //81
</script>

再总结一下:

上一篇 下一篇

猜你喜欢

热点阅读