• JS call、apply和bind


    call和apply和bind区别

    var obj = {name: 'lemon'};
    function fn(num1, num2){
        console.log(num1, num2);
        console.log(this);
    }
    fn.call(100, 200)
    

    -> NaN
    -> 100

    我想让fn中的this变为obj, 执行fn时传入参数为100, 200

    apply和call

    Function.prototype.call(thisArg, arg1, arg2, ...)
    
    Function.prototype..apply(thisArg, [argsArray])
    

    相同:

    • apply和call方法的作用是一模一样的, 都是用来改变方法的this关键字并且把方法执行, 而且在严格模式下和非严格模式下对于第一个参数是null/undefined这种情况的规律也是一样的

    不相同:

    • call再给fn传递参数的时候, 是一个一个的传递值的
    • apply不是一个一个传, 而是把要给fn传递的参数值统一的放在一个数组中进行操作, 但是也相当于一个个的给fn的形参赋值

    bind

    Function.prototype.bind( thisArg[, arg1[, arg2[, ...]]] s )
    

    bind: 这个方法在IE6-8下不兼容

    • 只是改变了fn中的this为obj, 并且给fn传递了参数, 但是此时没有把fn这个函数执行, 执行bind会有一个返回值, 这个返回值是把fn的this改变后的结果.
    • 它体现了一种预处理机制
    • 这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。

    使用call

    fn.call(obj, 100, 200)
    

    使用apply

    fn.apply(obj, [100, 200])
    

    bind

    fn.bind(obj, 100, 200)(100, 200)
    
    fn.bind(obj, 100)(200, 300)
    

    严格模式编写

    告诉浏览器接下来的JS代码按照严格模式进行编写:
    "use strict"

    我们发现严格模式下的this相对于非严格模式下的this主要区别在于:

    • 对于JS代码中没有写执行主体的情况下, 非严格模式下默认都是window执行, 所以this指向的是window
    • 但是在严格的模式下, 没有写就是没有执行主体, this指向的是undefined
  • 相关阅读:
    contentprovider的学习实例总结
    Android模拟器avd的创建、使用和调试相关命令
    android中的界面编程
    android的项目文件介绍
    下学期课程安排
    tcexa
    JavaScript,Java,php的区分大小写问题
    Spark RDD-行动算子
    Spark RDD-转化算子
    SparkCore RDD概述
  • 原文地址:https://www.cnblogs.com/xiaoxu-xmy/p/13646454.html
Copyright © 2020-2023  润新知