Call

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);
原文地址:https://www.cnblogs.com/Jiazexin/p/7080340.html