• 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
  • 相关阅读:
    使用PHP获取用户客户端真实IP的解决方案
    PHP中使用mkdir创建多级目录的方法
    javascript中将字符串转换为json格式的三种方法
    Codeigniter处理用户登录验证后URL跳转
    PHP正则表达式匹配URL中的域名
    开源项目列表
    PG JDBC COPY感谢原作者
    if中return的用法
    读数据库查询的 ResultSet时java.sql.SQLException: 流已被关闭
    一篇讲JAVA JDBC的好文章
  • 原文地址:https://www.cnblogs.com/xiaoxu-xmy/p/13646454.html
Copyright © 2020-2023  润新知