this的特性与用法
作为对象的方法调用
指向该对象
1 2 3 4 5 6
| var a = { func : function(){ this.b = "b"; } }; a.func();
|
作为普通函数调用
指向全局对象
1 2 3 4
| function func(){ this.a = "a"; }; func();
|
构造器调用
指向构造器返回的对象
1 2 3 4
| var a = function() { this.b = "b"; } var b = new a();
|
call或apply调用
动态改变this
1 2 3 4 5
| var a = function() { this.b = "b"; } var b = {}; a.apply(b,[])
|
Call,Apply和Bind
定义、区别以及联系
bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,
传入bind()方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.
call/apply区别:call传入不定参数, apply传入(类)数组对象;
- apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
- apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
- apply 、 call 、bind 三者都可以利用后续参数传参;
- bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用.
1 2 3 4 5 6 7 8 9 10 11 12 13
| var obj = { x: 1, }; var foo = { x: 2, getX: function() { return this.x; } } console.log(foo.getX.bind(obj)()); console.log(foo.getX.call(obj)); console.log(foo.getX.apply(obj)); console.log(foo.getX());
|
常用用法
改变参数类型
1 2 3 4 5 6
| var array1 = [1,2]; var array1 = [3,4]; Array.prototype.push.apply(array1, array2);
var numbers = [1,2,3]; Math.max.apply(Math, numbers);
|
类数组转换为标准数组
1 2 3
| function argumentsToArray(){ return Array.prototype.slice.call(arguments); }
|
运行时绑定参数
1 2 3 4 5 6 7 8 9 10
| var foo1 = { bar : 1, eventBind: function(){ $('a').on('click', function(event) { console.log(this.bar); }.bind(this) ); } }
|