javascriptの中のcallを詳しく説明します.
6516 ワード
jsを勉強している学生はcallを見たら、applyを隠しました.気持ちがよく分かりません.見た頭が大きいです.今日はこの二つの東を研究してみます.徹底的にそれらの使い方を調べます.
定義:
call、appyは関数の方法で、関数だけがこの2つの方法があります.
call、applyの主な役割は関数を変えて実行する作用領域です.簡単に言えば関数のthisの方向を変えることです.使い方:
fn.call(obj,args 1,args 2,…);Objは関数を指定して実行するオブジェクトで、arg 1などは関数に伝えるパラメータです.(もしあれば)fn.appy(obj、[args 1、args 2、...])///Objは関数を指定して実行するオブジェクトで、[arg 1、...]などは関数に伝えるパラメータ配列です.
違い:
callとapplyの違いはパラメータの違いです.callのパラメータは一つ一つ列挙しなければなりません.appyのパラメータは配列またはargmentsオブジェクトでなければなりません.
簡単にしましょう.
定義:
call、appyは関数の方法で、関数だけがこの2つの方法があります.
call、applyの主な役割は関数を変えて実行する作用領域です.簡単に言えば関数のthisの方向を変えることです.使い方:
fn.call(obj,args 1,args 2,…);Objは関数を指定して実行するオブジェクトで、arg 1などは関数に伝えるパラメータです.(もしあれば)fn.appy(obj、[args 1、args 2、...])///Objは関数を指定して実行するオブジェクトで、[arg 1、...]などは関数に伝えるパラメータ配列です.
違い:
callとapplyの違いはパラメータの違いです.callのパラメータは一つ一つ列挙しなければなりません.appyのパラメータは配列またはargmentsオブジェクトでなければなりません.
1:
function fn(arg){
alert(arg);
}
fn.call(this, 'hello world'); //hello world, fn this, this window .
fn.apply(this, ['hello world']); //hello world, fn this, this window .
2:
function fn(arg1, arg2, arg3){
alert(arg1 + arg2 + arg3);
}
fn.call(this, 'hello world', 'petty', 'jack'); //hello worldpettyjack
fn.apply(this, ['hello world', 'petty', 'jack']); //hello worldpettyjack
3:
function myFn(arg1, arg2, arg3){
alert(arg1 + arg2 + arg3);
}
function fn(arg1, arg2, arg3){
myFn.apply(this, arguments); // arguments , fn [arg1, arg2, arg3]
}
fn('hello', 'world', '!'); //helloworld!
4:
var o = {
name: 'tom'
};
function fn(){
alert(this.name);
}
fn.call(this); // this window, window name
fn.call(o); // this o, o name , 'tom'
fn.apply(o); //
5:
function MyFn(name){
this.name = name;
} //
function Fn(age, name){
this.age = age;
MyFn.call(this, name); // call , , MyFn name .
//MyFn.apply(this, [name]); //
} //
var person = new Fn(20, 'tom');
alert(person.name); // Fn name , call apply , MyFn name , 'tom'
call apply , jquery each .
function each(obj, fn){
var i;
if(Object.prototype.toString.call(obj) === '[object Array]'){
for(i = 0, length = obj.length; i < length; i++){
fn.call(obj[i], i, obj[i]);
}
}
else if(typeof obj === 'object'){
for(i in obj){
if(obj.hasOwnProperty(i)){
fn.call(obj[i], i, obj[i]);
}
}
}
else{
return false;
}
}
var oDiv = document.getElementsByTagName('div');
each(oDiv, function(){
this.style.background = '#ff0000'; // div .
});
簡単にしましょう.