bind函数是复制函数,在复制函数的时候改变了this的指向
//语法:fun.bind(thisArg,args…)

  1. function f1(x,y){
  2. console.log(x+y);
  3. console.log(this.age);
  4. }
  5. function Person(){
  6. this.age = 100;
  7. }
  8. var per = new Person();
  9. var ff = f1.bind(per,10,20); //这边将f1函数复制了一份,同时改变了f1函数中this的指向
  10. ff();

image.png

/
1.参数:
1.1 thisArg
当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用new 操作符调用绑定函数时,该参数无效。
1.2 arg1, arg2, …
当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。
2.返回值:返回由指定的this值和初始化参数改造的原函数拷贝
/

示例1:对象方法中this的修改

  1. function Person(age) {
  2. this.age=age;
  3. }
  4. Person.prototype.play=function () {
  5. console.log(this+"====>"+this.age);
  6. };
  7. function Student(age) {
  8. this.age=age;
  9. }
  10. var per=new Person(10);
  11. var stu=new Student(20);
  12. //复制了一份
  13. var ff=per.play.bind(stu);
  14. ff();

image.png

示例2:返回函数中this的修改

  1. var x = 9;
  2. var module = {
  3. x: 81,
  4. getX: function() {
  5. return this.x;
  6. }
  7. };
  8. module.getX(); // 返回 81
  9. var retrieveX = module.getX;
  10. retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域
  11. // 创建一个新函数,将"this"绑定到module对象
  12. // 新手可能会被全局的x变量和module里的属性x所迷惑
  13. var boundGetX = retrieveX.bind(module);
  14. boundGetX(); // 返回 81


示例3:定时器函数中this修改

  1. <script>
  2. function ShowRandom() {
  3. }
  4. ShowRandom.prototype.showRandom = function(){
  5. //通过bind方法来修改定时器中this指向
  6. var timer = setInterval(function(){
  7. var num = this.produceNum();
  8. console.log(num);
  9. }.bind(this),1000)
  10. }
  11. ShowRandom.prototype.produceNum = function(){
  12. return parseInt(Math.random()*10+1);//1~10的随机数
  13. }
  14. var s = new ShowRandom();
  15. s.showRandom();
  16. </script>

image.png