JS之call/apply/bind

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS之call/apply/bind相关的知识,希望对你有一定的参考价值。

 

测试代码:

var a = 1;
var obj = {
     a = 2;  
}

function test(a){
    alert(a);
    alert(this.a);  
}

 

1.test(3);

结果:3,1

函数中this指向window对象

2.test.call(thisObj,param1,param2....);

  thisObj:test函数中this的指向

  param1,param2...:传给test函数的参数

3.test.call(null,3)或者test.call(undefined,3);

结果为:1,3;

当thisObj是undefined或者null时,test中的this指向window

4.test.call(1,3);或者test.call("a",3)或者test.call(false,3)或者test.call([12],3)或者test.call(function(){},3)或者test.call(/ao/g,3);时

结果为:3,undefined

此时this的值为1,"a",flase,[12],function(){},/ao/g;里面没有a属性

5.test.call(obj,3);

结果为:3,2

6.test.apply(thisObj,[param1,param2...]);

除了给test传参数以数组形式,其他和test.call一样

7.test.bind(thisObj,param1,pamra2...);

bind()返回新的函数,这个函数是test的复制,但是里面的this指向thisObj

源码:

Function.prototype.bind = function(scope){
  var fn = this;
  return function(){
      fn.apply(scope);
   }
}

 

案例:

1.

var x = 100;
var foo = {
    x:200    
    }
var bar = function(a,b){
    console.log(this.x,a,b);    
}
bar(1,2);
var nBar = bar.bind(foo,4,5);
nBar();

 

bar(1,2)打印出:100,1,2;this指向widdow;

nBar()打印出:200,4,5;this指向foo,而且nBar在创建时,将4,5保存到nBar的参数列表中

2.

var x = 100;
var foo = {
    x:200    
}
var bar = function(a,b){
    console.log(this.x,a,b);    
    console.log(arguments);
}
bar(1,2);
var nBar = bar.bind(foo,4,5);
nBar(6,7);

 

nBar执行时:arguments里面保存了4,5,6,7

3.

 

以上是关于JS之call/apply/bind的主要内容,如果未能解决你的问题,请参考以下文章

JS中的call(),apply(),bind()方法

奇妙JS代码系列call,apply,bind用处整理

前端随心记---------call,bind,apply

js中的call,apply,bind区别

手写JS面试题 --- call apply bind 实现

JS call,apply, bind区别