1. 程式人生 > >javascript call用法及好處

javascript call用法及好處

javascipt 中 Call的用法及好處

javascript call可以改變當前函式的作用域,
基本用法如下

function Person(name){
    this.name = name;
}
Person.prototype.say = function(){
    console.log('My name is'+this.name);
}
var person = new Person('Mike');
person.say();//My name is Mike
//此時定義物件
var student = {name:'Marry'};
person.call(student);//My name is Marry

由結果可以看出call是改變當前函式的this指標,使其指向第一個引數,第二個引數是函式本身的引數,此處無參。
在實際應用中,經常會碰見類似於

var slice = [].slice();
var array = ['1','2','3'];
slice.call(array)

那此處的疑問是,array本身就有slice方法,為什麼不直接呼叫的?原因主要是,陣列中這些方法可用於處理陣列物件,也可處理類陣列物件,如果array物件中的原型方法發生改變,即使用者改寫了slice方法類似於如下操作

Array.prototype.slice= function(){
 console.log('我是改寫的slice方法'
) } var array = [1,2,3,4,5]; array.slice();//我是改寫的slice方法

若使用call

var slice = [].slice;
Array.prototype.slice= function(index){
 console.log('我是改寫的slice方法'+index)
}
var array = [1,2,3,4,5];
slice.call(array,3);//正常呼叫
array.slice(3);//輸出 '我是改寫的slice方法3'

故推薦使用call方法防止呼叫物件的原型方法被改變.