call/apply/bindの理解と実例を共有する.
2817 ワード
call/apply
は、関数のthis
の指向を変更することができる.パラメータを渡すときに差がある以外は、call
とapply
とは全く同じ働きをしています.var tim = {
name: 'tim',
age: 20,
getName: function() {
console.log(this.name);
return this.name;
}
}
var jake = { name: 'jake', age: 20 }
tim.getName(); // tim
// jake getName , call/apply tim getName
tim.getName.call(jake); // jake
tim.getName.apply(jake); // jake
tim.getName.call(jake)
は、getName
方法を実行するという意味であるが、call/apply
によってgetName
方法のthis
が、jake
オブジェクトに強制的に設定されていることを指す.だから最終的にはジャケに戻ります.call apply
の違いは、伝達パラメータの形式にある.apply
によって渡されるパラメータは配列形式であり、call
によって渡されるパラメータは順次配列される.簡単な例を説明します.// apply , apply
// obj fn,obj fn , this obj.
var arguments = { 0:'name', 1:'age', 2:'gender' };
fn.apply(obj, arguments);
fn.call(obj, name, age, gender);
私が出会った実際の例をいくつか集めました.// arguments
// ,arguments
var arg = [].slice.call(arguments);
// nodeList
var nList = [].slice.call(document.getElementsByTagName('li'));
var foo = {
name: 'joker',
showName: function() {
console.log(this.name);
}
};
var bar = {
name: 'rose'
};
foo.showName.call(bar); // rose
// parent
var Person = function(name) {
this.name = name;
this.gender = ['man', 'woman'];
}
// child
var Student = function(name, age) {
// inherit
Person.call(this);
}
Student.prototype.message = function() {
console.log('name:'+this.name+', age:'+this.age+', gender:.'+this.gender[0]);
}
var xm = new Student('xiaom', 12);
xm.message(); //name:undefined, age:undefined, gender:.man
var Nicco = function(name) {
this.name = name;
}
Nicco.prototype = function() {
constructor: Nicco,
message: function() {
var _this = this;
addEventListener(
'mousedown',
function() {
// stay this
return _this.fndown.call(_this);
},
false
);
},
fndown: function() {
var
_this = this,
str = this.name + ', i miss you.';
addEventListener(
'mouseup',
function() {
return _this.fnup.call(_this, str);
},
false
);
},
fnup: function(str) {
console.log(str);
}
}