call,apply与bind

call、apply与bind(Function.prototype中的属性)

	我觉得这么一说,就明白了为什么会去调用函数了。
   	call()或apply()的好处是可以把任意对象设置为任意函数的作用域。 
  	等同于将函数作为了对象的属性,然后通过对象.属性的方式调用函数。

	而bind()会创建新的函数实例, 其this值会被绑定到 传给bind()的对象。
  • call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
  • function.call(thisArg, arg1, arg2, …)
    • 参数 :thisArg. 可选的。在function函数运行时的this值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装.
    • 返回值 : 使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined
        function f() {
            console.log(this + '\n\nf');
        }
    
        function f1() {
    
            console.log(this + '\n\nf1');
        }
        f.call(f1);
        /* function f1() {
              console.log(this + '\n\nf1');
            } 
            f
        */
        function f() {
            console.log(this + '\n\nf');
        }
    
        function f1() {
    
            console.log(this + '\n\nf1');
        }
        f.call();
        /*[object Window]
    
          f
        */
        function f(value) {
            console.log(value);
            console.log(this + '\n\nf');
        }
    
        function f1() {
            console.log(this + '\n\nf1');
        }
        f.call(f1, 'fjh');
        /*
          fjh
          function f1() {
                      console.log(this + '\n\nf1');
          }
    
          f
        */
    
    • 应用:
      • call() 允许为不同的对象分配和调用属于一个对象的函数/方法。
      • call() 提供新的 this 值给当前调用的函数/方法。你可以使用 call 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)
        第二个应用就是通过构造函数来继承。
        主要是第一个应用。它可以使对象调用别的对象的方法。这样对于一些同名的情况,我们就可以任意调用不同对象下的同名函数。
      
  • apply() 基本类似于 call(),不同在于参数是数组/伪数组。
  • func.apply(thisArg, [argsArray])
    • 参数:thisArg. 必选的。在 func 函数运行时使用的 this 值。
    • 返回值 :调用有指定this值和参数的函数的结果。
    • apply应用
  • bind()
  • fun.bind(thisArg[, arg1[, arg2[, …]]])
    • 参数:调用绑定函数时作为 this 参数传递给目标函数的值
    • 返回值:返回一个原函数的拷贝,并拥有指定的 this 值和初始参数
    • bind应用
    	window.color = "red";
    	var o ={
    		color: 'blue'
    	};
    	function sayColor(){
    		console.log(this.color);
    	}
    	let objectSayColor = sayColor.bind(o);
    	objectSayColor() ; 
    	/* blue
    			在sayColor()上调用bind()并传入对象 o 创建了一个函数objectSayColor(). 	objectSayColor()中的this被设置为 o 。 因此直接调用这个函数,即使是在全局作用域中调用,也会返回'blue';
    	*/ 
    
  1. 不会执行对应的函数,call或apply会自动执行对应的函数
  2. bind是ES5新增的一个方法.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值