js中call,apply与bind三函数
2016-08-08 09:44
609 查看
js的call,apply,bind方法,切换/固定this指向
func.call(thisValue, arg1, arg2, ...);
第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需要的参数.
例:
function add(a, b) {
return a + b;
}
add.call(this, 1, 2);
call方法的一个应用是调用对象的原生方法
var obj = {};
obj.hasOwnProperty('toString'); //false
obj.hasOwnProperty = function () {
return true;
}
obj.hasOwnProperty('toString'); //true
object.prototype.hasOwnPRoperty.call(obj, 'toString'); //false
function.prototype.apply()
apply方法和call类似,也是改变this指向,然后调用该函数,唯一的区别是:它接受一个数组作为函数执行
时的参数,使用格式如下:
func.apply(thisValue,[arg1, arg2, ...]);
function f(x, y) {
return x + y;
}
f.call(this,1,1);
f.apply(this,[1, 1]);
function.prototype.bind()
bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数.
var print = console.log;
print(4);
//报错,因为此时console.log中的this对象已经不指向console了
使用bing解决这个问题
var print = console.log.bind(console);
print(2);
例:
var counter = {
count: 0,
inc: function() {
this.count++;
}
};
counter.count; //0
counter.inc();
counter.count(); //1
this指向莫名的改变
var counter = {
count: 0,
inc: function() {
this.count++;
}
};
var func = counter.inc;
func();//此时this指向window,莫名改变了...
如何解决这个问题,使用bind
var func = counter.inc.bind(counter);
将inc内部的this绑定到counter对象上
bind比call和apply方法更屌的是,除了绑定this之外,还可以绑定原函数的参数.
var add = function(x, y) {
return x * this.m + y * this.n;
};
var obj = {
m: 2,
n: 2
};
var newAdd = add.bind(obj, 5);
newAdd(5); //20
call方法与bind方法的结合使用
[1, 2, 3].slice(0, 1);
Array.prototype.slice.call([1, 2, 3], 0, 1);
Array.prototype.slice.apply([1, 2, 3], [0, 1]);
var slice = Function.prototype.call.bind(Array.prototype.slice);
slice([1, 2, 3], 0, 1);
func.call(thisValue, arg1, arg2, ...);
第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需要的参数.
例:
function add(a, b) {
return a + b;
}
add.call(this, 1, 2);
call方法的一个应用是调用对象的原生方法
var obj = {};
obj.hasOwnProperty('toString'); //false
obj.hasOwnProperty = function () {
return true;
}
obj.hasOwnProperty('toString'); //true
object.prototype.hasOwnPRoperty.call(obj, 'toString'); //false
function.prototype.apply()
apply方法和call类似,也是改变this指向,然后调用该函数,唯一的区别是:它接受一个数组作为函数执行
时的参数,使用格式如下:
func.apply(thisValue,[arg1, arg2, ...]);
function f(x, y) {
return x + y;
}
f.call(this,1,1);
f.apply(this,[1, 1]);
function.prototype.bind()
bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数.
var print = console.log;
print(4);
//报错,因为此时console.log中的this对象已经不指向console了
使用bing解决这个问题
var print = console.log.bind(console);
print(2);
例:
var counter = {
count: 0,
inc: function() {
this.count++;
}
};
counter.count; //0
counter.inc();
counter.count(); //1
this指向莫名的改变
var counter = {
count: 0,
inc: function() {
this.count++;
}
};
var func = counter.inc;
func();//此时this指向window,莫名改变了...
如何解决这个问题,使用bind
var func = counter.inc.bind(counter);
将inc内部的this绑定到counter对象上
bind比call和apply方法更屌的是,除了绑定this之外,还可以绑定原函数的参数.
var add = function(x, y) {
return x * this.m + y * this.n;
};
var obj = {
m: 2,
n: 2
};
var newAdd = add.bind(obj, 5);
newAdd(5); //20
call方法与bind方法的结合使用
[1, 2, 3].slice(0, 1);
Array.prototype.slice.call([1, 2, 3], 0, 1);
Array.prototype.slice.apply([1, 2, 3], [0, 1]);
var slice = Function.prototype.call.bind(Array.prototype.slice);
slice([1, 2, 3], 0, 1);
相关文章推荐
- js函数的间接调用call()、apply()和bind()
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
- js函数中的apply()、call()、bind()方法
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
- js中函数对象的方法,原型方法apply、call、bind、toString、toLocaleString、valueOf
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
- JS中的call、apply、bind方法
- js apply/call/caller/callee/bind使用方法与区别分析
- 对js中call、apply和bind的理解
- js---js中的继承方法call、bind、apply,以及三者之间的区别总结。
- JS中的call、apply、bind方法
- js apply/call/caller/callee/bind使用方法与区别分析
- js中call、 apply、 bind的用法
- !!js中call、apply、bind的用法
- JS 函数中的arguments,call,apply
- js中bind、call、apply的方法使用
- 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
- js call apply caller callee bind
- 详解js中call apply bind
- JS 中 call、apply、bind 那些事