call的作用记住三句话!
第一:改变前方法的this,不管前面有多少东西
第二:让前方法执行,不管前面有多长
第三:call方法最终执行的一核心是this()
PS:注意!两个及以上的call.最后一个call的第一个参数是来改变前面call方法中的this,那么this()就是变成了第一个参数执行,所以第一个参数必须是函数,否则会报错!!!
原型上的call方法是一个函数,这个方法至少要传一个参数,这个参数是用来改变call前面的方法的this的.
call两个作用:
1.改变this,
2让当前函数执行
实例.call//call中的this就是实例本身
所有的函数都有一个属性length,表示形参的数量
fn.call(window)1.将fn中的this变成window.2让fn执行
fn.call(obj)1.将fn中的this变成obj.2让fn执行
在非严格模式下不产参数或者传null和Undefined,默认时window,在严格模式下"use strict",不传参数或者null或者Undefined是将this变成了Undefined
call方法从第二个参数开始就是给前面的函数传的参数
function(n,m){};
fn.call(obj,1,2)
当使用函数.call.call(),两个以上的call你传的参数不是一个函数就会报错,因为只有函数的原型上才会有call这个方法 .
换句话说你用两个及以上的call方法执行的时候,就相当于把你传进来的那个函数执行
fn.call();
fn.call.call(obj);//obj.call()
call方法原理
function fn(){
console.log(this);
}
var obj={1:1};
Function.prototype.call=function(obj.n.m){
//谁去执行call方法this就是谁
obj是改变this的this
假如说fn.call,这里面的this就是fn
就把
};
=========================================
严格模式
"use strict"//严格模式
//函数执行的时候,前面没有点,this->Undefined
function fn(){}
fn();
window.fn();
call()不传参数this->Undefined;传了个null->this=null;传了undefined->this就是undefined
fn.call();//Undefined
fn.call
call将类数组转为数组
try catch 方法
try catch(e)
try{
先执行try里面的代码,如果报错就执行catch里面的代码
}catch(e){
e是一个对象,里面存在错误信息,存在e.message里面存的是try里面的错误信息
throw new Error("我错误")//抛出错误
}
function toArray(likeArray) {
//call在低版本IE下不支持
var ary = [ ];
try {
return ary.prototype.slice.call(likeArray, 0);
}
catch (e) {
console.log(e.message);
for(var i=0;i<likeArray.length;i++) {
ary.push(likeArray[i])
}
return ary
}
}
function fn() {
return toArray(arguments)
}
console.log(fn(1, 2, 3, 5, 6, 7, 10));
Call的核心
call是个函数,是定义在Function原型上的函数属性,所有的函数都可以通过_ _ proto _ _找到Function类原型上的call方法. call方法在执行的时候里面的this就是call前面的点"."之前的东西
call方法中个核心的代码就是this()执行,也就是call前面的函数执行
Function.prototype.call=function(){};
function fn(){
console.log(this)
}
fn.call(null,1,2);