call apply blind

call、apply、blind:

  1. 定义的位置:Function.prototype 函数类的原型上,相对于每个Function的实例来说都是公有方法。

call

  1. 执行步骤:
    1. 通过一个Function类的实例来先找到定义在Function.prototype的call
    2. call方法把这个函数实例中的this修改成了call的第一个参数;(ps:call从第二个参数开始都是传给调用call的函数实例的)
    3. 函数实例执行(ps:用call的时候,带执行效果)
  2. 事件中的this修改:
    • 严格模式和非严格模式区别:(”use strict” 严格模式,放在script标签下的第一行)
      1. 使用call的时刻,如果把this修改成null或者undefined时,在非严格模式下会默认this为window
      2. 自运行函数的this和函数执行前没有”.”,在严格模式下this都是undefined
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        div1.onclick = function () {
        fn.call(document.body);
        };
        function fn() {
        this; //-->body;
        }
        ////////////////////////////////////////////
        function sum(num1,num2) {
        this;
        return num1+num2;
        }
        sum.call(undefined,100,200); //-->在非严格模式下:undefined/null/等,会自动默认this值

apply

  1. 和call的方法的作用基本相同,apply的第二个参数是一个数组,会把数组中的每一项作为调用apply方法的函数实例的参数。(和call一样,都是在修改完this之后直接把函数执行了)

    1
    2
    3
    4
    function sum(a, b) {
    console.log(a + b);
    }
    sum.apply(null, [100, 200])
  2. 取数组中的最大值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Math.max.apply(null,ary);//将数组中的每一项作为参数的时候
    ////////////////////////////////////////////
    var ary = [1,2,3];
    console.log(eval("Math.max(" + ary.join() + ")"));
    /////////////////////////////////////////////////////////////
    //用架设的方法 ——》|
    var max = ary[0];
    for (var i = 1; i < ary.length; i++) {
    if (ary[i] > max) {
    max = ary[i];
    }
    } //循环结束后,max为ary的最大值

blind: 不兼容

  • call和apply都已经把函数执行结束,.blind()会返回一个在fn的基础上修改了this的新函数。使用bind的时候,只是修改this,返回值执行的时候再传参,不兼容。

    consider

  • fn1.call.call.call(fn2):多个call的时候,其实就是第一个参数执行;

    Object.prototype.toString.call();

  • 相当于call把toString中的this修改成了数组,而原型上方法中的this一般是实例,已经把this更改成了这个数组。那么toString就被数组偷偷的调用了一次。
  • Object原型上的toString方法打印”[object Object]”这样的字符串。后半部分就是标记当前实例所属于的类;
  • 判断当前数据是不是{}的对象?? –》 “[object Object]”

    for in

  • hasOwnProperty
  • propertyIsEnumerable检查是否为可枚举属性

    sort

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ary.sort(function (a, b) {
    //a,b分别就是数组中要比较的相邻两项
    return a - b; //return的这个a-b的差就是是否交换位置的依据:若果为整数,则交换位置;mx
    // return a.age - b.age; 按对象中的某个属性(数字)排序
    // return a.name.localeCompare(b.name); 字符串排序
    //"a".localeCompare("b") --》 -1 不变
    //"a".localeCompare("a") --》0 不变
    //"a".localeCompare("b") --》1 倒排
    })

try

1
2
3
4
5
try{
先尝试执行这里的代码,如果报错那么执行catch内的代码;
}catch(e){
e是一个对象,e.message属性保存着报错的信息;
}